bookdataテーブルが関係するテストを実装しています。
正常動作時のテストは実施しましたので、エラー時のテストを実装していきます。
新規登録時と編集時のテストから実施しました。
※画像投稿関連については処理成功時同様、今回の対象から除外としています。
前回記事はこちら。
fippiy.hatenablog.jp
今回の目的
書籍情報登録時の失敗パターンをテストし、想定動作していることを確認する
なぜやるか
エラー発生時の動作が正常に行えていることの担保をとるため。
やりたいこと
- 書籍情報新規登録時、登録失敗時のエラー情報が出力されていることをテストする
- ISBN登録時のエラー情報が出力されていることをテストする
やったこと
バリデーションによりエラーした時の情報が取得できていることを確認する
実施内容
手動新規登録に対してのエラーチェック
タイトルのみ入力必須としているので、タイトル未入力時のエラーをチェックします。
# ~/tests/Feature/BookdataTest.php
//// NGパターン調査
// 手動登録タイトル未入力
public function test_bookControll_ng_notNameEntry()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
//// 登録
$bookdata = [
'title' => '',
'detail' => '詳細はこちら',
];
$response = $this->from('book/create')->post('book', $bookdata); // 本情報保存
$response->assertSessionHasErrors(['title']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book/create'); // トップページ表示
$this->assertEquals('titleは必須です。',
session('errors')->first('title')); // エラメッセージを確認
}
本のタイトルを空欄で登録し、バリデーションエラーから必須であることのエラー文を取得できていることを確認しています。
ISBN登録時のチェック
コード未入力時のチェック
まずは入力せずに登録ボタンを押した場合をテストします。
# ~/tests/Feature/BookdataTest.php
// ISBN登録未入力
public function test_bookControll_ng_notIsbnEntry()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
//// 登録
$bookdata = [
'isbn' => ''
];
$response = $this->from('book/isbn')->post('book/isbn', $bookdata); // isbn登録
$response->assertSessionHasErrors(['isbn']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book/isbn'); // 同ページ表示
$this->assertEquals('isbnは必須です。',
session('errors')->first('isbn')); // エラメッセージを確認
}
ISBN未入力によってエラーメッセージを確認し、リダイレクトしてエラーメッセージが出力されていることを確認しています。
桁数不一致時のチェック
ISBNコードは13桁に対応しているので、桁数があわない場合はエラーとしています。
//// 登録
$bookdata = [
'isbn' => '123456789012'
];
$response = $this->from('book/isbn')->post('book/isbn', $bookdata); // isbn登録
$response->assertSessionHasErrors(['isbn']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book/isbn'); // 同ページ表示
$this->assertEquals('isbnは13桁にしてください',
session('errors')->first('isbn')); // エラメッセージを確認
}
上記は12桁でのテストです、同様に14桁でもテストしています。
13桁のみOKとしているので、前後のチェックをしておけば問題ないでしょう。
ISBNコードによる検索結果がなかった場合
13桁で入力された場合はAPIによって書籍情報を取得しています。
//// 登録
$bookdata = [
'isbn' => '1234567890123'
];
$response = $this->from('book/isbn')->post('book/isbn', $bookdata); // isbn登録
$response->assertSessionHasErrors(['isbn']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book/isbn'); // 同ページ表示
$this->assertEquals('該当するISBNコードは見つかりませんでした。',
session('errors')->first('isbn')); // エラメッセージを確認
}
以前の記事で、検索結果がない場合をバリデーションエラーと扱いましたので、同じようにエラーを取得する方法でテストしています。
テスト時はバリデーションエラーが取得できていれば検索結果情報までテストする必要はないので、このような設定としました。
書籍情報編集時のチェック
続いて、編集時のエラーについてもチェックします。
タイトル未入力時のチェック
// 書籍情報編集NG、タイトルなし
public function test_bookControll_ng_notTitleEdit()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
//// 仮本新規登録
$bookdata = factory(Bookdata::class)->create(); // 書籍を作成
$bookpath = 'book/'.$bookdata->id.'/edit'; // 書籍編集パス
//// 登録
$editbookdata = [
'title' => '',
]; // タイトルなしに編集
$response = $this->from($bookpath)->post('book', $editbookdata); // 本情報保存
$response->assertSessionHasErrors(['title']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect($bookpath); // トップページ表示
$this->assertEquals('titleは必須です。',
session('errors')->first('title')); // エラメッセージを確認
}
書籍タイトルを空欄にしていた場合のチェックです。
先程の新規登録時とほぼ同じですが、フォームページが異なる為、URLを変更しています。
編集書籍のidが異なる場合のチェック
// 書籍情報編集NG、未登録id
public function test_bookControll_ng_notIdEdit()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
//// 仮本新規登録
$bookdata = factory(Bookdata::class)->create(); // 書籍を作成
$bookpath = 'book/2/edit'; // 書籍編集パス(存在しないID)
$response = $this->get($bookpath); // 存在しないページにアクセス
$response->assertStatus(500); // 500ステータスであること
}
そもそも登録されていないidにアクセスする手段はありません、あるとすれば直接URLにid指定してアクセスするといったことが考えられます。
そして実際にアクセスしてもページが存在しませんので、存在しないページに対してのエラーを出力できていることを確認しています。
以上で書籍登録と編集に対してのテストは終了です。
次は、削除時のテストを行います。
fippiy.hatenablog.jp