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 關注
- 154 瀏覽
添加回答
舉報