Laravelのテンプレート内では常に$errors
という変数が定義されていて、Redirect::to(...)->withErrors($validator)
などとしたときにエラーの内容がSessionStore経由でリダイレクト先にセットされる。この処理はIlluminate\View\ViewServiceProvider#registerSessionBinder()
で、bootedイベントリスナーとして登録されている。
TestCaseはデフォルトではリダイレクトをfollowしないが、BrowserKitのfollowRedirect()
を呼び出すことでfollowすることができる。
$form = $this->client->getCrawler()->selectButton("Submit")->form();
$this->client->submit($form);
$this->client->followRedirect();
これを使ってリダイレクト先でエラーメッセージが表示されることをテストできるかと思ったのだが、この時bootedイベントリスナーは呼び出されないため、$errors
はセットされない。結果、ブラウザでテストするとエラーメッセージは表示されるがTestCaseからは見えない。
このため、エラーメッセージをテストするにはセッションの内容を確認するのが妥当のようだ。
$this->assertSessionHas('errors');
$this->assertSessionHasErrors(['email', 'password']);
$this->assertSessionHasErrors(['name' => 'The name field is required.']);