34

Laravel のドキュメントDatabaseMigrationsでは、テスト間でデータベースを移行およびロールバックするためにトレイトを使用することを推奨しています。

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
    use DatabaseMigrations;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->get('/');

        // ...
    }
}

ただし、テストで使用したいシード データがいくつかあります。私が実行した場合:

php artisan migrate --seed

その後、最初のテストでは機能しますが、その後のテストは失敗します。これは、トレイトが移行をロールバックし、移行を再度実行するときにデータベースをシードしないためです。移行でデータベース シードを実行するにはどうすればよいですか?

4

7 に答える 7

25

これを理解するのに少し掘り下げたので、共有したいと思いました.

DatabaseMigrationstraitのソース コードを見ると、すべてのテストの前に実行され、ティアダウン時に実行されるコールバックを登録するrunDatabaseMigrationsによって呼び出される1 つの関数があることがわかります。setUp

その関数にエイリアスを付けることで特性を「拡張」しartisan db:seed、元の名前でロジックを使用して新しい関数を再宣言し ( )、その中でエイリアスを呼び出すことができます。

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
    use DatabaseMigrations {
        runDatabaseMigrations as baseRunDatabaseMigrations;
    }

    /**
     * Define hooks to migrate the database before and after each test.
     *
     * @return void
     */
    public function runDatabaseMigrations()
    {
        $this->baseRunDatabaseMigrations();
        $this->artisan('db:seed');
    }

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->get('/');

        // ...
    }
}
于 2017-02-20T16:52:39.717 に答える