Laravel - 测试重定向后会发生什么

时间:2014-12-03 22:01:19

标签: php redirect laravel phpunit

我有一个控制器,在提交电子邮件后,执行重定向到家庭,如下所示:

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遵循重定向?

5 个答案:

答案 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;

在您的测试用例的类文件中