既存の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

By khino