複数ISBN登録は作成できましたが、一部修正を行うことにしました。
ISBN未入力については結果を表示しないことと、処理状況が分かりやすいコードに修正を行っていきます。
最終目的
ISBNコードを10件まで1フォームから入力して登録できるようにする
今回の目的
- ISBN複数登録に対してテストコードを用意し、正常動作を確認する
なぜやるか
- 複数登録処理が問題なく動作していることを確認するため
やりたいこと
- 正しく入力された処理が正しいと判断されること
- 想定される問題点に対して正常どうさしていること
やったこと
- 13桁コードを複数入力して正常動作すること
- 全件未入力時にバリデーションエラーとなること
- 桁数アンマッチで想定される結果出力されること
- フォーム重複登録で想定される結果出力されること
- DB登録済みで想定される結果出力されること
- API検索結果がなかった場合の結果出力が正常にされること
実施内容
複数ISBN登録ができることを確認する
まずは登録が行えることを確認します。
# ~/tests/Feature/BookdataTest.php
// 複数isbn登録と表示確認
public function test_someIsbnCreate_ok(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// isbnページアクセス
$response = $this->get('/book/isbn_some'); // isbnへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.isbn_some'); // book.isbnビューであること
// 登録
$isbn0 = 9784798052588;
$isbn1 = 9784756918765;
$isbns = [
'isbn0' => $isbn0,
'isbn1' => $isbn1,
]; // 新規登録コード
$response = $this->from('book/isbn_some')->post('book/isbn_some', $isbns);
// isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
$response->assertSeeText($isbn0); // 入力番号が反映されていること
$response->assertSeeText($isbn1); // 入力番号が反映されていること
$savebook = Bookdata::first();
$response->assertSeeText($savebook->title); // 取得した本のタイトルがが反映されていること
$bookcount = count(Bookdata::all());
$savebook = Bookdata::find($bookcount);
$response->assertSeeText($savebook->title); // 取得した本のタイトルがが反映されていること
}
まずログインを実施しておき、複数ISBN登録ページにアクセスできることを確認します。
登録コードを複数用意してまとめてpost送信を行い、登録結果ページで各ISBN及びISBNから取得したタイトル名が表示できていることを確認しています。
登録に失敗するパターンをテストする
正常に登録する処理はできましたので、途中問題があり登録できないパターンについてテストを行っていきます。
ISBNが1件も入力されていない時
# ~/tests/Feature/BookdataTest.php
// 複数isbn登録エラー、登録なし
public function test_someIsbnCreate_ng_notEntry(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 登録
$bookpath = 'book/isbn_some';
$response = $this->from($bookpath)->post($bookpath, []); // isbn情報保存
$response->assertSessionHasErrors(['isbnrecords']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect($bookpath); // トップページ表示
$this->assertEquals('ISBNコードが入力されていません',
session('errors')->first('isbnrecords')); // エラメッセージを確認
}
登録がない場合はバリデーションによるエラーとしていました。
post送信を行うとエラーメッセージを受け取るので、メッセージがあること・リダイレクトされること・メッセージが出力されていることを確認しています。
ISBNの桁数が合わない時
# ~/tests/Feature/BookdataTest.php
// 複数isbn登録エラー、コード12桁
public function test_someIsbnCreate_ng_isbn12(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 登録
$isbn0 = 123456789012;
$isbns = [
'isbn0' => $isbn0,
]; // 新規登録コード
$bookpath = 'book/isbn_some';
$response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
$response->assertSeeText($isbn0); // 入力番号が反映されていること
$response->assertSeeText('桁数が13桁ではありません。');
// 取得できていない旨のメッセージが表示されること
}
全件未入力以外に関しては処理結果を専用ページにて出力としていましたので、バリデーションによるエラーではなく、結果画面にメッセージを出力するとしていました。
ですので、バリデーションとしては特にエラーはありません。
桁数不一致により登録結果画面で13桁でないという旨のメッセージが出力されていることを確認しています。
今回はISBNを12桁でテストしたパターンですが、14桁も同様にテストしています。
フォーム入力ISBN重複時
# ~/tests/Feature/BookdataTest.php
// 複数isbn登録エラー、フォーム重複
public function test_someIsbnCreate_ng_formEntryDouble(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 登録
$isbn0 = 9784798052588;
$isbn1 = 9784798052588;
$isbns = [
'isbn0' => $isbn0,
'isbn1' => $isbn1,
]; // 新規登録コード
$bookpath = 'book/isbn_some';
$response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
$response->assertSeeText($isbn0); // 入力番号が反映されていること
$response->assertSeeText("1件目のデータと同じです。"); // 重複メッセージが表示されること
}
フォームには複数ISBNを登録できるようにしましたが、同じISBNが入力された場合の処理をテストしました。
2件目のデータ出力時に1件目のデータと同じですと出力されていることを確認しています。
DB登録済みISBN登録時
# ~/tests/Feature/BookdataTest.php
// 複数isbn登録エラー、DB重複
public function test_someIsbnCreate_ng_InDbEntry(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// faker book自動生成
$bookdata = factory(Bookdata::class)->create([
'title' => 'a',
'isbn' => '9784798052588'
]); // DBにISBNを登録しておく
// 登録
$isbn0 = 9784798052588;
$isbns = [
'isbn0' => $isbn0,
]; // 新規登録コード
$bookpath = 'book/isbn_some';
$response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
$response->assertSeeText($isbn0); // 入力番号が反映されていること
$response->assertSeeText("既に登録されています。"); // 重複メッセージが表示されること
}
次はDBに既に登録されている情報を追加した時のテストです。
DBにISBN番号指定で登録を行っておき、同じ番号をpost送信しています。
DB上に先にデータを作成しているので、すでに登録済みとなり、重複登録している旨のメッセージが表示されていることを確認しています。
API検索結果がなかった場合
# ~/tests/Feature/BookdataTest.php
public function test_someIsbnCreate_ng_findNotData(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 登録
$isbn0 = 1234567890123;
$isbns = [
'isbn0' => $isbn0,
]; // 新規登録コード
$bookpath = 'book/isbn_some';
$response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
$response->assertSeeText($isbn0); // 入力番号が反映されていること
$response->assertSeeText('該当するISBNコードは見つかりませんでした。');
// 取得できていない旨のメッセージが表示されること
}
最後はAPIによる検索まで実施するも、データがなかった場合です。
結果としてデータがない情報を準備しておき、post送信して登録結果がなかった場合のメッセージが出力されていることを確認しています。
実際の処理に問題がみつかる
このテストが通れば一通り完了…といきたかったのですが、最後のAPI検索して書籍情報がなかったというテストは失敗しました。
テストに問題があるわけではなく、実際の処理方法に問題があることが分かりましたので、テストはこのままにしておき、次で処理を修正することにしました。