【Laravel】テストでassertRedirect()の後にassertSeeText()を実行するとエラーになる問題の解決方法

Twikmark(https://twikmark.com/)では、ログインしていない状態でブックマークページを開こうとするとトップページへリダイレクトするようにしている。

その動作をテストしようと思って以下のコードを書いたらエラーでテストが通らなかった。

assertSeeText()が通らないテストコード


public function testGuestRedirectToTop() {
    $response = $this->get('/user_name/bookmarks'); // "user_name"の部分の文字列は何でも良い
    $response->assertRedirect('/')
             ->assertSeeText('Twitterアカウントでログインして下さい。');
}
上記テストで発生したエラーのメッセージ


Failed asserting that '\n \n     \n         \n         \n \n         Redirecting to http://127.0.0.1:8000\n     \n     \n         Redirecting to http://127.0.0.1:8000.\n     \n ' contains "Twitterアカウントでログインして下さい。".

at tests/Feature/Test.php:33
  32|         $response->assertRedirect('/')
> 33|                  ->assertSeeText('Twitterアカウントでログインして下さい。');
  34|     }
  35| }

assertRedirect()は「指定のURIへリダイレクトすること」をチェックするだけであってリダレクトそのものを行ってくれるわけではないことが原因(リダイレクトしていないから確認したい文言が存在せずにエラーになる)。

assertRedirect

クライアントが指定したURIへリダイレクトすることを宣言。

https://readouble.com/laravel/7.x/ja/http-tests.html#assert-redirect

なので、assertRedirect()の後に明示的にget()でページ移動をしてやるとassertSeeText()が通るようになる。

assertSeeText()が通るテストコード


public function testGuestRedirectToTop() {
    $response = $this->get('/user_name/bookmarks'); // "user_name"の部分の文字列は何でも良い

    $response->assertRedirect('/');
    $this->get('/')  // ここで明示的にトップページへ移動させる必要がある
         ->assertSeeText('Twitterアカウントでログインして下さい。');
}
上記テストの結果


PASS  Tests\Feature\Test
✓ guest redirect to top

Tests:  1 passed
Time:   3.12s
vagrant@homestead:~/code/project_name$ 

参考

https://nijibox.jp/blog/laraveltest_beginner/#in1

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です