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$
参考