3 回答
TA贡献1830条经验 获得超3个赞
在迁移运行之前,你可能需要覆盖 trait 中的方法,并从那里设置应用的数据库路径。runDatabaseMigrationsDatabaseMigrations
该方法可能最终如下所示: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
if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
$this->app->useDatabasePath(base_path('tests/database'));
}
迁移将查找名为“迁移”的“测试/数据库”子文件夹。
PS:如果您在默认文件夹中有其他代码或文件夹,则会有副作用。例如,对于此测试类,将找不到您的工厂类。database
TA贡献1817条经验 获得超14个赞
工匠迁移有一个路径选项,你必须做出自己的特质才能具有类似的功能。我在想这样的事情。
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;
});
}
}
TA贡献1836条经验 获得超4个赞
该 trait 具有一个调用的方法,该方法将重载它在运行迁移时使用的参数。我更改为单个测试的特定测试迁移文件,方法是将其作为迁移参数传入。RefreshDatabasemigrateUsing--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;
}
- 3 回答
- 0 关注
- 104 浏览
添加回答
举报