Laravel:如何在迁移文件中访问测试类内的ModelFactory数据
结论:这种方式不可行
核心原因
- Laravel的测试进程与Artisan迁移进程是完全隔离的。你在测试中通过ModelFactory创建的数据,仅存在于当前测试进程的数据库连接上下文里;而调用
$this->artisan('migrate', ['--path' => 'database/migrations/2022_11_17_150008_back_fill-data.php']);会启动一个独立的Artisan子进程,这个子进程无法访问测试进程中的数据状态。 - 即便使用同一个数据库,若你的测试默认开启了事务(Laravel测试默认会自动回滚事务),测试数据根本不会被提交到数据库,迁移进程自然读不到;就算关闭事务,两个进程的数据库连接是独立实例,迁移进程启动时也无法共享测试进程已创建的数据。
可行的替代方式
- 把数据清理逻辑抽离到独立类(如Service类),测试中创建假数据后,直接调用该类的清理方法验证逻辑,无需通过迁移执行。
- 若一定要通过迁移验证,可在迁移文件内部使用ModelFactory创建测试数据,或者在测试中主动提交事务(关闭自动回滚)让数据写入数据库,但这种方式会污染测试数据库,需要额外做清理操作。
内容的提问来源于stack exchange,提问作者livreson ltc
相关产品推荐
相关产品推荐

