web-dev-qa-db-ja.com

Laravel-リダイレクト後に何が起こるかをテストする

メールを送信した後、次のように自宅へのリダイレクトを実行するコントローラーがあります。

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がリダイレクトに従う方法はありますか?

23

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 を参照してください。

36
huntie

次の方法でリダイレクトに従うようにクローラーに指示できます。

$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);
}
8
jsawo

Laravel 6では、リダイレクトをテストするには assertRedirect を使用できます。

/** @test */
public function store_creates_claim()
{
    $response = $this->post(route('claims.store'), [
        'first_name' => 'Joe',
    ]);

    $response->assertRedirect(route('claims.index'));
}
1
yesnik

Laravel 5.6の場合、

$protected followRedirects = true;

テストケースのクラスファイル内

0
Ryan Firth