CRUDの内updateとdeleteは既存データを加工します。この機能をテストするならば、必然データを壊します。この壊すデータの範囲に重要なものが紛れている場合、問題が起こります。私は今日テスト環境の画面確認用管理者アカウントを壊しました。
update,deleteをテストするために重要なデータをテスト対象とした場合、テスト中止ないし再起動とする方法があります。この方法にはテスト対象とした範囲に重要なデータしか存在しない場合テストを行えないという欠点があります。もう一つ新たにデータを作成し、それに対してupdate,deleteをテストする方法があります。この手法はコード量が増えがちです。Laravelはfactoryという仕組みを用いてコード量の節約、責任の分担をしています。
データベースのテスト 5.6 Laravel#ファクトリの記述
ファクトリはダミーデータを作成する仕組みでデータベースにテスト用初期データを入れる、データベースのテストに用いるといった使い方が主ですが、更新、削除のテストでもよく働いてくれます。factoryは次の様な記述によって与えるデータを定義します。
/** /database/factories/UserFactory.php */ use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), ]; });
これを定義した場合、次の様にダミーデータをワンライナーで呼び出せます。createはデータベースへの書き込みを実行してインスタンスのCollectionを返し、makeはインスタンスのCollecitonを返します。
// factory(Model::class, 個数) $user = factory(User::class, 1)->create()->first(); $new_user_data = factory(User::class, 1)->make()->first();
createは削除と更新用の壊していいデータ、makeは更新用の入力値として便利に使えます。