Laravel 测试响应是否包含错误?

Laravel test if the response contains errors?

我正在处理遗留代码并尝试使用测试来覆盖代码以供以后重构。在一个控制器中有这样一段代码:

return redirect()->route('login')->withErrors(['invalid credentials']);

这是我对测试的断言:

$response->assertRedirect(route('login'));
$response->assertSessionHasErrors([
    0 => 'invalid credentials'
]);

但问题是我得到以下输出:

Session missing error: 'invalid credentials'
Failed asserting that false is true.

知道如何完成这项工作吗?

查看 assertSessionHasErrors() 的源代码,我认为您的用例无法完成。问题是您的 withErrors(...) 方法中的未命名数组。我看到两个选项供您选择:

  • 将您的遗留应用程序更改为:
return redirect()->route('login')->withErrors(['error' => 'invalid credentials']);

之后你可以运行你的测试像这样:

$response->assertRedirect(route('login'));    
$response->assertSessionHasErrors([
    'error' => 'invalid credentials'
]);
  • 如果您无法更改您的遗留应用程序,您可以使用此:
$response->assertRedirect(route('login'));    
$this->assertEquals(session('errors')->getBag('default')->first(),'invalid credentials');