メールを送信した後、次のように自宅へのリダイレクトを実行するコントローラーがあります。
return Redirect::route('home')->with("message", "Ok!");
私はそのためのテストを書いており、phpunitがリダイレクトをたどって成功メッセージをテストする方法を知りません:
public function testMessageSucceeds() {
$crawler = $this->client->request('POST', '/contact', ['email' => '[email protected]', 'message' => "lorem ipsum"]);
$this->assertResponseStatus(302);
$this->assertRedirectedToRoute('home');
$message = $crawler->filter('.success-message');
// Here it fails
$this->assertCount(1, $message);
}
これをコントローラーのコードに置き換え、最初の2つのアサートを削除すると、機能します
Session::flash('message', 'Ok!');
return $this->makeView('staticPages.home');
しかし、私はRedirect::route
を使用したいと思います。 PHPUnitがリダイレクトに従う方法はありますか?
PHPUnitを使用して、リダイレクトを追跡できます。
Laravel> = 5.5.19:
$this->followingRedirects();
Laravel <5.4.12:
$this->followRedirects();
用途:
$response = $this->followingRedirects()
->post('/login', ['email' => '[email protected]'])
->assertStatus(200);
注:これは、各リクエストに対して明示的に設定する必要があります。
これらの2つの間のバージョンの場合:
回避策については https://github.com/laravel/framework/issues/18016#issuecomment-32240171 を参照してください。
次の方法でリダイレクトに従うようにクローラーに指示できます。
$crawler = $this->client->followRedirect();
したがって、あなたの場合は次のようになります:
public function testMessageSucceeds() {
$this->client->request('POST', '/contact', ['email' => '[email protected]', 'message' => "lorem ipsum"]);
$this->assertResponseStatus(302);
$this->assertRedirectedToRoute('home');
$crawler = $this->client->followRedirect();
$message = $crawler->filter('.success-message');
$this->assertCount(1, $message);
}
Laravel 6では、リダイレクトをテストするには assertRedirect を使用できます。
/** @test */
public function store_creates_claim()
{
$response = $this->post(route('claims.store'), [
'first_name' => 'Joe',
]);
$response->assertRedirect(route('claims.index'));
}
Laravel 5.6の場合、
$protected followRedirects = true;
テストケースのクラスファイル内