Laravel phpunit 如何使用不同的迁移进行测试

Hen*_*Jan 6 php phpunit database-migration laravel

我正在尝试在 Laravel 中设置测试,但我想运行与通常运行的迁移不同的迁移。

我运行的用于启动数据库的迁移从生产环境导入数据。
为了进行测试,我想使用一个名为“test”的不同数据库,并且我想用测试数据而不是生产数据填充此测试数据库。

我添加了一个config/database.php使用“测试”数据库的“测试”连接:

'connections' => [

        'mysql' => [
            'database' => env('DB_DATABASE', 'forge'),
            ...
        ],

        'testing' => [
            'database' => 'test',
            ...
        ],
],
Run Code Online (Sandbox Code Playgroud)

我设置phpunit.xml使用这个“测试”连接:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
    ...
    <php>
        <env name="DB_CONNECTION" value="testing"/>
        ...
    </php>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

现在我想使用测试数据初始化这个“测试”数据库,使用来自与默认文件夹不同的文件夹的迁移。

我可以像这样使用正常的迁移:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

abstract class TestCase extends BaseTestCase
{
    use DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这使用默认文件夹database/migrations。我想将测试迁移放在文件夹中tests/database/migrations

有没有办法让use DatabaseMigrations;使用来自另一个文件夹的迁移?

Olu*_*kin 11

您可能需要覆盖特征runDatabaseMigrations中的方法DatabaseMigrations,并在迁移运行之前从那里设置应用程序的数据库路径。

runDatabaseMigrations方法最终可能如下所示:

use DatabaseMigrations { runDatabaseMigrations as runMigration; }

    public function runDatabaseMigrations()
    {
        $this->app->useDatabasePath(base_path('tests/database')); //example path
//        dump($this->app->databasePath());
        $this->runMigration();
    }
Run Code Online (Sandbox Code Playgroud)

boot或者您可以在AppService 提供者的方法中设置:

    if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
        $this->app->useDatabasePath(base_path('tests/database'));
    }
Run Code Online (Sandbox Code Playgroud)

迁移将查找“tests/database”的子文件夹,称为“migrations”。

PS:如果默认文件夹中有其他代码或文件夹,则会产生副作用database。例如,您的工厂类将找不到该测试类。