我正试图在Laravel中设置测试,但我想运行与通常运行的迁移不同的迁移。
我运行的用于启动数据库的迁移从生产环境中导入数据。
对于测试,我想使用一个不同的数据库,称为" test ",我希望用测试数据来填充这个测试数据库,而不是生产数据。
我添加了一个到config/database.php的“测试”连接,它使用"test“数据库:
'connections' => [
'mysql' => [
'database' => env('DB_DATABASE', 'forge'),
...
],
'testing' => [
'database' => 'test',
...
],
],我设置了phpunit.xml来使用这个“测试”连接:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
...
<php>
<env name="DB_CONNECTION" value="testing"/>
...
</php>
</phpunit>现在,我想用测试数据初始化这个“测试”数据库,使用与默认情况不同的文件夹迁移。
我可以使用像这样的正常迁移:
<?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();
}
}但这使用默认文件夹database/migrations。我想把测试迁移放到tests/database/migrations文件夹中。
有办法让use DatabaseMigrations;使用来自另一个文件夹的迁移吗?
发布于 2020-01-15 14:07:19
在迁移运行之前,您可能需要在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();
}也可以在boot提供程序的AppService方法中设置:
if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
$this->app->useDatabasePath(base_path('tests/database'));
}迁移将寻找一个名为“迁移”的“测试/数据库”的子文件夹。
PS:如果您在默认的
database文件夹中有其他代码或文件夹,则会产生副作用。例如,在这个测试类中找不到您的工厂类.
发布于 2020-01-15 14:22:52
手工迁移有一个路径选项,您必须使自己的特性具有类似的功能。我在想像这样的事。
trait PathDatabaseMigrations {
public function runDatabaseMigrations()
{
// optimal
$path = 'tests/database/migrations';
$this->artisan('migrate:fresh', ['--path' => $path,]);
$this->app[Kernel::class]->setArtisan(null);
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback', ['--path' => $path,]);
RefreshDatabaseState::$migrated = false;
});
}
}发布于 2022-03-17 23:33:46
RefreshDatabase特性有一个名为migrateUsing的方法,它将重载它在运行迁移时使用的参数。通过将单个测试作为--path参数传入到迁移中,我更改为单个测试的特定测试迁移文件。
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Traits\HasUuid;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\RefreshDatabase;
class HasUuidTest extends TestCase
{
use RefreshDatabase;
protected function migrateUsing()
{
return [
'--path' => 'tests/migrations/2022_03_15_220516_create_test_uuid_table.php'
];
}
public function test_has_uuid()
{
$model = new TestUuid;
$this->assertEmpty($model->id);
$model->save();
$this->assertNotEmpty($model->id);
}
}
class TestUuid extends Model
{
use HasUuid;
}https://stackoverflow.com/questions/59752426
复制相似问题