Laravel - Testing what happens after a redirect

徘徊边缘 提交于 2019-12-18 14:12:11

问题


I have a controller that after submitting a email, performs a redirect to the home, like this:

return Redirect::route('home')->with("message", "Ok!");

I am writing the tests for it, and I am not sure how to make phpunit to follow the redirect, to test the success message:

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);
}

If I substitute the code on the controller for this, and I remove the first 2 asserts, it works

Session::flash('message', 'Ok!');
return $this->makeView('staticPages.home');

But I would like to use the Redirect::route. Is there a way to make PHPUnit to follow the redirect?


回答1:


You can get PHPUnit to follow redirects with:

Laravel >= 5.5.19:

$this->followingRedirects();

Laravel < 5.4.12:

$this->followRedirects();

Usage:

$response = $this->followingRedirects()
    ->post('/login', ['email' => 'john@example.com'])
    ->assertStatus(200);

Note: This needs to be set explicitly for each request.


For versions between these two:

See https://github.com/laravel/framework/issues/18016#issuecomment-322401713 for a workaround.




回答2:


You can tell crawler to follow a redirect this way:

$crawler = $this->client->followRedirect();

so in your case that would be something like:

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);
}



回答3:


For Laravel 5.6, you can set

$protected followRedirects = true;

within your class file for your test case



来源:https://stackoverflow.com/questions/27282519/laravel-testing-what-happens-after-a-redirect

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!