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

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

Laravel開発、propertyテーブルをテストする【2】Property固有の正常動作テストを追加実装する

前回の内容では1件のデータを登録しておき問題なく表示が行えることを確認しました。

fippiy.hatenablog.jp

しかし、複数のユーザーが所有書籍を登録している状態で、自身のデータのみが参照できている…という点までは考慮されていません。

この点を考慮したテストを追加で行っていきます。

今回の目的

所有書籍登録情報固有テストとして、複数ユーザーデータから、ログインユーザーのみの情報が表示されていることをテストする。 

なぜやるか

 所有書籍登録確認テストは実施したが、複数ユーザー環境下でログインユーザーのみの情報が取得できていることを確認するため

やりたいこと

  • テスト用の複数ユーザーをまとめて作成する
  • 作成した複数ユーザーに対して所有書籍情報を複数作成する
  • 所有書籍情報作成時に書籍情報も作成する
  • 特定のユーザーで自身の所有書籍のみが取得できていることを確認する 

やったこと

 

実施内容

複数データをまとめて作成する

 

ユーザーを作成する

今回は複数のユーザーを想定しているので、複数ユーザーを作成してその中から任意のユーザーでログインする形としました。

# ~/tests/Feature/PropertyTest.php

public function test_propertySomeControll_ok()
{
// 設定
$usernumber = 10;// ユーザー数

// ユーザー情報
factory(User::class, $usernumber)->create(); // 複数ユーザー作成
$user = User::find(mt_rand(1,$usernumber)); // ランダムでユーザー情報取得
$this->actingAs($user); // 選択ユーザーでログイン
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
↓続く

テストできれば人数の差はあまり関係ないかもしれませんが、予めユーザー数を宣言しておきて、指定ユーザー数分のユーザーを作成する形としました。

ファクトリーの第二引数に数を指定することで、まとめてユーザーを作成しています。

 

ランダムな数値を取得して任意ユーザーを選択

今回は10ユーザーの情報を作成後に、ランダムで1ユーザーを選択してログインする形としました。

ランダム数値取得に関しては、こちらを参考にさせて頂きました、ありがとうございます。

web-dev.xyz

mt_rand(1, $usernumber)によって1〜10までの数値から任意の数を指定してユーザー情報を取得しています。

これによって毎回テストするユーザーが変化します。

そして、取得したユーザーでログインをしておき、次のテストにすすみます。

 

ユーザー毎の所有書籍情報を作成する

続いて、作成したユーザーに対して所有書籍情報を追加します

# ~/tests/Feature/PropertyTest.php

// 設定
$booknumber = 10;// 所有書籍数
// 所有書籍情報登録
// 複数ユーザー分の所有書籍情報
for ($usercount = 1; $usercount <= $usernumber; $usercount++) {
// 各ユーザーに対して複数書籍所持情報を作成
for ($i = 1; $i <= $booknumber; $i++) {
$propertydata = factory(Property::class)->create([
'user_id' => $usercount,
]);
}
}
↓続く

ユーザー毎にfor文による繰り返しを行い、1ユーザーに対して$booknumber分の書籍情報を登録という形としました。

Propertファクトリーを利用して、$usercountの値をuser_idに割り当てることで、先程作成したユーザーに対して複数の書籍を所持しているケースとして作成しています。

 

所有書籍情報作成時に、本自体の情報も生成する

所有書籍情報はこれで作成できますが、所有書籍情報に関連する書籍情報自体の作成も必要となります。

ファクトリーの扱いについては、こちらを参考にさせて頂きました、ありがとうございます。

qiita.com

書籍そのものの情報は、Propertyファクトリー上で同時に作成できるようにしました。

# ~/database/factories/PropertyFactory.php

$factory->define(Property::class, function (Faker $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'bookdata_id' => function() {
return factory(App\Bookdata::class)->create()->id;
},
'number' => mt_rand(1,10),
'getdate' => $faker->date,
'freememo' => $faker->name,
];
});

ファクトリー上でbookdataを参照させてやることで、書籍情報を一緒に作成しています。

ユーザーも自動作成できるようにしていますが、このまま使用すると1ユーザーに複数書籍という形から崩れてしまうので、先程のfor文によって固定ユーザーに対して複数書籍所持を実現しています。

 

選択ユーザの所有書籍情報だけが表示されていることを確認する

データ設定が完了すれば、最後は選択ユーザーに対しての所有書籍のみが表示されていることを確認すれば終了です。

# ~/tests/Feature/PropertyTest.php

// 選択ユーザーの所有書籍情報を取得
$savebooks = Property::where('user_id', $user->id)->get();

// 選択ユーザーの所有書籍が登録されていることの確認
$response = $this->get('property'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('property.index'); // book.indexビューであること
 
foreach ($savebooks as $savebook) {
$response->assertSeeText($savebook->bookdata->title);
} // 登録タイトルが表示されていること
}

今回取得したユーザーが所持している書籍のみをwhereで選択しておき、index画面上でユーザーが所持している書籍情報のみが表示されていることを確認しました。

 

以上で、propertyテーブルテストの正常動作については確認がとれました。

NGパターンについては次以降で実装していきます。