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。例如,您的工厂类将找不到该测试类。