Laravel 5.5下PHPUnit登录测试失败:断言200却返回302
解决Laravel 5.5 PHPUnit登录测试302状态码断言失败问题
嘿,我来帮你捋清楚这个问题~你遇到的Failed asserting that 302 matches expected 200错误,本质是对Laravel登录流程的状态码逻辑理解有误,咱们一步步拆解:
为什么会返回302而不是200?
Laravel的默认认证系统处理登录请求时,无论登录成功还是失败,都会触发重定向:
- 登录成功:重定向到配置的默认路径(比如
/home) - 登录失败:重定向回登录页面,同时把错误信息存入Session
所以你的测试断言200状态码本身就不符合框架的默认行为,这才导致了失败。
修正后的测试代码示例
根据你要测试的场景(登录成功/失败),调整测试逻辑:
测试登录成功场景
public function testLoginPostSuccess() { Session::start(); $response = $this->call('POST', 'login', [ 'email' => 'sokhter@yahoo.com', 'password' => '123456', '_token' => csrf_token() ]); // 断言重定向状态码302 $this->assertEquals(302, $response->getStatusCode()); // 断言重定向到登录成功后的目标页面(根据你的路由配置调整) $this->assertRedirectedTo('/home'); // 额外验证用户已成功认证 $this->assertAuthenticated(); }
测试登录失败场景
public function testLoginPostFailure() { Session::start(); $response = $this->call('POST', 'login', [ 'email' => 'invalid@example.com', 'password' => 'wrongpassword', '_token' => csrf_token() ]); $this->assertEquals(302, $response->getStatusCode()); // 断言重定向回登录页面 $this->assertRedirectedTo('login'); // 验证Session中存在错误提示 $this->assertSessionHasErrors(); // 验证用户未被认证 $this->assertGuest(); }
额外说明
你原来代码中的$this->assertEquals('auth.login', $response->original->name());也会报错,因为重定向响应的$response->original是RedirectResponse实例,而不是视图对象。只有当请求返回200状态的视图时,才能这样断言视图名称。
内容的提问来源于stack exchange,提问作者Rahman
相关产品推荐
相关产品推荐

