既存のDBからmigrationファイルを自動作成によって、テストのために空のDBテーブルの作成が可能となりました。今度は、そこへテストデータを作成するためにfactoryが必要となります。これも自動作成しましょう。
どうして、factoryのファイルが必要?
factoryのファイルが必要なのは、あらゆるテストの目的のためです。いちいち画面の入力でDBレコードを作成する代わりに、tinkerやユニットテストでfactory()
のヘルパーを使用して簡単にレコードが作成できようになります。factoryのタグの記事では、たくさんの使用例を見ることできます。
しかし、現状の以下のLaravelのコマンドの実行では、
$ php artisan make:factory UserFactory --model=User
作成されるfactoryは、以下のように項目もない単なるテンプレートです。
/** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Model; use Faker\Generator as Faker; $factory->define(User::class, function (Faker $faker) { return [ // ]; });
DBテーブルがたくさんあるプロジェクトでは、いちいちこれを編集していくのはとても大変です。それゆえに、既存のDB構造をもとに、自動でfactoryファイルを生成する必要があります。
factoryファイル自動生成ツール
まずは、パッケージのインストール。以下をコマンドラインで実行します。
$ composer require --dev mpociot/laravel-test-factory-helper
factoryのファイルを作成するには、artisanの実行が必要となります。Laravel 6.x の新規プロジェクトを作成して実行しますが、すでにUserのモデルのためのfactoryファイルが、databases/factories/UserFactory.phpとして存在するので、上書きされないように改名しておきます。そして以下をコマンドラインで実行します。
$ php artisan generate:model-factory Model factory created: database/factories/UserFactory.php
作成されたfactoryの内容は以下です。
/* @var $factory \Illuminate\Database\Eloquent\Factory */ use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->safeEmail, 'email_verified_at' => $faker->dateTime(), 'password' => bcrypt($faker->password), 'remember_token' => Str::random(10), ]; });
元にあったファイルと比べてみましょう。以下が元のファイルです。
/** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\User; use Faker\Generator as Faker; use Illuminate\Support\Str; $factory->define(User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; });
いくつか違いがありますね。しかし、これも自動生成されたmigrationファイルと同様に使用するテストに合わせて編集すればよいです。
Fakerのドキュメントは、こちらです。
factoryファイル自動作成のコマンドのartisanの実行には、いくつかのオプションを指定することができます。
すべてのモデルのfactoryを作成する代わりに、指定のモデルだけのfactoryの作成には、
$ php artisan generate:model-factory User Team
モデルのファイルがが、app/Modelsのディレクトリにあるなら、
$ php artisan generate:model-factory --dir app/Models -- User Team
と実行できます。
最後に、migrationとfactoryの自動作成ツールは、Laravelのバージョンによりインストールが違うのでここでまとめてリストします。
Laravel 6.x
$ composer require --dev oscarafdev/migrations-generator 2.0.13 $ composer require --dev mpociot/laravel-test-factory-helper
Laravel 5.5~
$ composer require --dev xethron/migrations-generator $ composer require --dev mpociot/laravel-test-factory-helper v1.3メルマガ購読の申し込みはこちらから。