You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的Laravel登录单元测试中用户凭证无法正常生效?

Laravel PHPUnit登录测试返回400状态码排查方案

  • 第一步:先打印接口完整响应排查根因
    400属于客户端错误,绝大多数情况是参数校验不通过,你可以在请求后输出完整响应内容,直接定位错误原因:
    在$response = $this->postJson(...)后添加代码dd($response->json());,运行测试就能看到接口返回的具体错误提示,比如密码错误、缺少必填参数等。

  • 第二步:修正密码传参错误(最常见的触发原因)
    Laravel的User工厂默认会将密码哈希后存入数据库,你代码中直接读取$user->password传入登录接口,实际传的是哈希后的密文,而登录接口要求传入明文密码做哈希校验,必然会校验失败。
    修正方案:工厂创建用户时指定固定明文密码的哈希值,测试时传对应明文即可:

public function test_user_can_login(): void
{
    // 工厂创建用户阶段,明文密码设为test@123,哈希后入库
    $user = User::factory()->create([
        'password' => Hash::make('test@123'),
    ]);
    // 登录请求传明文密码
    $response = $this->postJson('/api/auth/login', [
        'email'    => $user->email,
        'password' => 'test@123',
    ]);

    $response
        ->assertStatus(200)
        ->assertHeader('Authorization')
        ->assertJson([
            'success' => 'Usuário logado com sucesso!',
        ]);
}
  • 第三步:排查其他可能原因
    • 检查测试代码语法错误:原代码中public function test_user_can_login():尾部只有冒号未声明返回类型,需要补全返回类型声明(比如: void),避免语法报错。
    • 核对登录接口的参数规则:确认是否要求除邮箱、密码外的其他必填参数,比如验证码、设备标识等,缺失必填参数也会返回400。
    • 核对路由规则:确认/api/auth/login路径、请求方法是否正确,路由是否有权限限制、中间件拦截。
    • 确认User工厂创建的用户数据合规:检查是否存在邮箱未验证、用户状态禁用等业务规则限制,导致登录被拒绝。

内容的提问来源于stack exchange,提问作者Edgard Bertelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 17:09:04