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?
Advertisement
Answer
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.