我有一个控制器,在提交电子邮件后,执行重定向到家庭,如下所示:
return Redirect::route('home')->with("message", "Ok!");
我正在为它编写测试,我不知道如何让phpunit按照重定向来测试成功消息:
public function testMessageSucceeds() {
$crawler = $this->client->request('POST', '/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);
$this->assertResponseStatus(302);
$this->assertRedirectedToRoute('home');
$message = $crawler->filter('.success-message');
// Here it fails
$this->assertCount(1, $message);
}
如果我替换控制器上的代码,我将删除前两个断言,它可以正常工作
Session::flash('message', 'Ok!');
return $this->makeView('staticPages.home');
但我想使用Redirect::route
。有没有办法让PHPUnit遵循重定向?
答案 0 :(得分:25)
您可以通过以下方式让PHPUnit跟踪重定向:
Laravel> = 5.5.19 :
$this->followingRedirects();
Laravel< 5.4.12 强>:
$this->followRedirects();
<强>用法:强>
$response = $this->followingRedirects()
->post('/login', ['email' => 'john@example.com'])
->assertStatus(200);
注意:需要为每个请求明确设置。
适用于这两者之间的版本:
请参阅https://github.com/laravel/framework/issues/18016#issuecomment-322401713了解解决方法。
答案 1 :(得分:7)
您可以告诉抓取工具以这种方式遵循重定向:
$crawler = $this->client->followRedirect();
所以在你的情况下会是这样的:
public function testMessageSucceeds() {
$this->client->request('POST', '/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);
$this->assertResponseStatus(302);
$this->assertRedirectedToRoute('home');
$crawler = $this->client->followRedirect();
$message = $crawler->filter('.success-message');
$this->assertCount(1, $message);
}
答案 2 :(得分:0)
在Laravel 6中,您可以使用assertRedirect来测试重定向:
<body background="here is the url of the background">
<table class="center" >
<tr>
<td><button class="btn btn-1 btn-sep icon-info">A</button></td>
<button class="btn btn-4 btn-sep icon-send">B</button>
</tr>
<tr>
<td><button class="btn btn-2 btn-sep icon-cart">C</button></td>
<td><button class="btn btn-3 btn-sep icon-heart">D</button></td>
</tr>
</table>
答案 3 :(得分:0)
Laravel 8经过测试
$response = $this->post'/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);
$response->assertStatus(302);
$response->assertRedirect('home');
$this->followsRedirects($response)->assertSee('.success-message');
//or
$this->followsRedirects($response)->assertSee('Ok!');
为我工作,希望能帮上忙。
答案 4 :(得分:-1)
对于Laravel 5.6,您可以设置
$protected followRedirects = true;
在您的测试用例的类文件中