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

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

Laravel開発、複数削除処理に対応する【3】複数削除テストを作成する

本情報の複数削除を作成が完了しましたので、テストによるチェックをおこなってプログラムが問題ないか確認を実施します。

今回の目的

複数削除仕様についてテストを作成し、問題なく処理できることを確認する

なぜやるか

テスト処理によって問題なく動作することを担保するため

やりたいこと

  • 削除用ダミーデータを複数用意する
  • 削除データをpost送信し、正常に削除できること
  • bookとpropertyそれぞれで正常動作すること

やったこと

  • bookとpropertyそれぞれで処理ができていることを確認する
  • factoryで複数件数データを作成する
  • post送信用データに連番配列を利用する
  • 削除結果が全て表示されていることを確認する

実施内容

書籍情報削除をテストする

まずは本の情報自体を消すページからテストしました。

# ~/tests/Feature/BookdataTest.php

// 複数削除
public function test_bookControll_ok_someDelete(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // faker 自動生成
 $delete_bookdatas = factory(Bookdata::class, 20)->create();
 // 送信フォームパス
 $formpath = 'book/somedelete';
 // 削除データ
 $deletedata = ['select_books' => range(1, 20)];
 //// 削除
 $response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること
 $response->assertViewIs('book.delete_result'); // book.delete_resultビューであること
 // 削除されていることの確認(resultページ)
 $response->assertSeeText('書籍削除結果'); // 削除結果ページが出力されていること
 $response->assertStatus(200); // 200ステータスであること
 foreach($delete_bookdatas as $deletebook){
  $response->assertSeeText($deletebook->title); // 削除タイトルが結果に反映されていること
 }
}

書籍情報を複数削除した際に正常に削除されていることを確認しています。

factoryで複数データを作成する

初めにログイン状態にしておき、factoryを使用して本の情報を作成します。複数まとめて作成うる為に第二引数に数を指定しています。

連番配列を使う

フォームからselect_books配列に削除する本のidを指定してpost送信します。

本のidは書籍作成時に自動採番されるので、作成した本の数だけ配列として作成しています。

今回は20件の本をfactoryで作成しているので、rangeを利用して連番配列としました。

range(1,20) = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]となっています。

20になっているのは、削除に関しても上限設定をしていたので、それに合わせています。

削除タイトルを確認する

削除後は結果表示を確認します。

factoryで作成時のデータを利用して、削除タイトル名がリストとして表示されていれば正常に結果表示されていることになります。

 

所有書籍情報削除をテストする

ユーザーが所有している本の情報に対しても削除機能をつけましたので、所有情報が解除できているかもテストを行います。

# ~/tests/Feature/PropertyTest.php

// 複数削除
public function test_propertySomeControll_ok_someDelete(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // faker 自動生成
 $delete_propertydatas = factory(Property::class, 20)->create([
  'user_id' => $user->id,
 ]);
 // 送信フォームパス
 $formpath = 'property/somedelete';
 // 削除データ
 $deletedatas = ['select_books' => range(1, 20)];
 //// 削除
 $response = $this->from($formpath)->post($formpath, $deletedatas); // 削除実施
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること
 $response->assertViewIs('property.delete_result');
 // property.delete_resultビューであること

 // 削除されていることの確認(resultページ)
 $response->assertSeeText('所有書籍情報解除結果'); // 削除結果ページが出力されていること
 $response->assertStatus(200); // 200ステータスであること
 foreach($delete_propertydatas as $deleteproperty){
  $response->assertSeeText($deleteproperty->bookdata->title);
 // 削除タイトルが結果に反映されていること
 }
}

基本的には書籍削除と同じです。

ユーザーは固定する

factoryは所有情報が必要となるので、Property::classとして作成しています。

こちらのファクトリーは書籍情報、ユーザー、所有情報の3つがまとめて作成できるようにしていました。

しかし、そのまま作成するとbook.id=1,property.id=1,user.id=1とそれぞれに対してidが付与されます。

このまま作成してしまうと、ユーザーが20人分となり、1ユーザーが20書籍所持とはならないので、ユーザーだけは初めにログインしたユーザーで固定としました。

リレーションを利用する

最後は削除した所有書籍情報の結果を確認します。

作成したPropertyデータからタイトルを取得して確認できれば完了です。リレーションを組んでいるので、$deletepropety->bookdata->titleとbookdataを中継してやることで、書籍情報にアクセスしてタイトルを取得しました。

 

以上で正常動作時のテストは完了です。

残りのエラー時のテストは次で実施します。