bookdataテーブルが関係するテストを実装しています。
エラー時のテストとして、残るは検索に対してのテストです。
今回の目的
書籍情報検索時の失敗パターンをテストし、想定動作していることを確認する
なぜやるか
エラー発生時の動作が正常に行えていることの担保をとるため。
やりたいこと
- 検索タイトル名が空欄時にエラーが正しく表示されること
- 検索タイトルが見つからなかった時のエラーが正しく表示されること
やったこと
バリデーションによりエラーした時の情報が取得できていることを確認する
実施内容
タイトルが空欄時のエラーをチェックする
タイトル入力欄が空欄時にはエラーとする実装をしていますので、想定動作することをテストします。
# ~/tests/Feature/BookdataTest.php
public function test_findTitle_ng_noTitle()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
//// 検索
// 検索の実施(findページ)
$find_post = 'book/find'; // 検索パス
$response = $this->get($find_post); // 検索ページへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.find'); // book.findビューであること
$response = $this->from($find_post)->post($find_post, ['find' => '']); // 検索実施
$response->assertSessionHasErrors('find'); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book/find'); // 同ページへリダイレクト
$this->assertEquals('検索ワードは必須です。',
session('errors')->first('find')); // エラメッセージを確認
}
検索フォームからpostでデータ送信をします。この時、検索ワードは空欄にしておくことで入力なしで検索しています。
検索ワードなしによりバリデーションにひっかかり、エラーメッセージが返されリダイレクトされていることを確認しています。
検索結果がなかった場合をテストする
検索タイトルなしはエラーでなく、検索結果なしを表示するメッセージとして実装していました。
エラーではなく結果として該当書籍がない分けなので、正常に検索された結果として出力されます。
そのためエラーとしてではなく、OKパターンとしてテストを実装することとしました。
# ~/tests/Feature/BookdataTest.php
public function test_findTitle_ok_noMatchFindTitle()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// faker book自動生成
$bookdata = factory(Bookdata::class)->create([
'title' => 'a'
]); // タイトル名aで作成
//// 検索
// 検索の実施(findページ)
$find_post = 'book/find'; // 検索パス
$response = $this->get($find_post); // 検索ページへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.find'); // book.findビューであること
$response = $this->from($find_post)->post($find_post, ['find' => 'b']); // bで検索実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200 ステータスであること
$response->assertViewIs('book.find'); // book.findビューであること
$response->assertSeeText('書籍がみつかりませんでした。'); // タイトルなしメッセージが表示されていること
}
タイトル名aという本を作成しておき、タイトルbで検索をすることで検索結果0件としてテストしました。
バリデーションエラーとはならない為、あくまでステータスとしては正常終了していることを確認しています。
その上で、$msgという変数を利用して、みつからなかったというメッセージを出力させているのでメッセージが表示されていることを確認する…といった形でテストを実施しました。
以上でbookdataに関するテストは完了です。
次は、他のテーブルのテストがまだ残っているので実施します。