为什么我的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
相关产品推荐
相关产品推荐

