きっかけ
laravelにてfeatureテストを記述していたときに、post処理後のリダイレクト先でフラッシュメッセージを assertSee したくなった。
assertSee について
レスポンス内に指定の文字列があるかを確認してくれる。
基本的なアサートの一つ。
public function test_テキストチェック()
{
$response = $this->get('user');
// /user に "user一覧" と記述されていればテストが通る
$response->assertStatus(200)->assertSee('user一覧');
}
この他にも、文字列を順番に記述されているかを確認してくれる「assertSeeInOrder」など、便利なものがいくつか存在します。
詳しくは、下記をご覧ください。
問題
便利な assertSee ですが、下記のような記述ではリダイレクト先までは見てくれません。。
public function test_テキストチェック()
{
$response = $this->post('user', [
'name' => 'hello',
'email' => 'world@example.com',
]);
// redirect前のテキストを確認してしまうので、テストは通らない。
$response->assertStatus(302)->assertSee('user一覧');
}
解決策
2パターンの解決策があるみたいです。
パターン1
post後に再度getを行う。
この場合でもflashメッセージは正しく確認できるみたいです。
public function test_テキストチェック()
{
$response = $this->post('user', [
'name' => 'hello',
'email' => 'world@example.com',
]);
$response->assertStatus(302);
$this->get('user')->assertSee('user一覧');
}
パターン2
followRedirectsを使用する。
こちらも問題なくflashメッセージの確認ができます。
public function test_テキストチェック()
{
$response = $this->post('user', [
'name' => 'hello',
'email' => 'world@example.com',
]);
$response->assertStatus(302);
$this->followRedirects($response)->assertSee('user一覧');
}
参考