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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:55:43