Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、bookdataテーブルをテストする【4】書籍情報検索時のテストを実装する

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に関するテストは完了です。

次は、他のテーブルのテストがまだ残っているので実施します。