如何为 laravel 测试的种子数据库迁移?

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

然后它适用于第一个测试,但它未通过后续测试。这是因为该特征回滚迁移,并且当它再次运行迁移时,它不会为数据库设定种子。如何在迁移时运行数据库种子?


答案 1

您需要做的就是在setUp函数中进行工匠调用db:seed

<?php

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
    use DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();

        // seed the database
        $this->artisan('db:seed');
        // alternatively you can call
        // $this->seed();
    }

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

        // ...
    }
}

参考: https://laravel.com/docs/5.6/testing#creating-and-running-tests


答案 2

我花了一些挖掘才弄清楚这一点,所以我想我会分享

如果您查看 DatabaseMigrations 特征的源代码,那么您会发现它有一个由 setUp 调用的函数 runDatabaseMigrations,该函数在每次测试之前运行,并注册一个回调以在拆解时运行。

您可以通过别名该函数来“扩展”特征,在原始名称下重新声明具有逻辑的新函数(),并调用其中的别名。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('/');

        // ...
    }
}

推荐