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

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

Laravel開発、bookdataテーブルをテストする【2】書籍情報登録時・編集時のエラーテストを実装する

bookdataテーブルが関係するテストを実装しています。

正常動作時のテストは実施しましたので、エラー時のテストを実装していきます。

新規登録時と編集時のテストから実施しました。

※画像投稿関連については処理成功時同様、今回の対象から除外としています。 

前回記事はこちら。

fippiy.hatenablog.jp

今回の目的

書籍情報登録時の失敗パターンをテストし、想定動作していることを確認する

なぜやるか

エラー発生時の動作が正常に行えていることの担保をとるため。

やりたいこと

  • 書籍情報新規登録時、登録失敗時のエラー情報が出力されていることをテストする
  • ISBN登録時のエラー情報が出力されていることをテストする

やったこと

バリデーションによりエラーした時の情報が取得できていることを確認する

  • 手動登録時
  • 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