Laravel 10中RefreshDatabase trait未按预期为每个测试包裹事务的问题求助
Laravel 10中RefreshDatabase trait未按预期为每个测试包裹事务的问题求助
根据RefreshDatabase文档说明:
Illuminate\Foundation\Testing\RefreshDatabasetrait会在数据库架构已更新至最新时跳过迁移,转而将每个测试包裹在数据库事务中执行。
我在Laravel 10的项目里使用这个trait时,发现它并没有按预期工作,遇到了两个问题:
Problem #1
由于项目迁移执行耗时约1分钟(执行命令php artisan migrate:fresh --env testing),我本地维护了一个保持最新状态的测试数据库,本以为这样能快速运行测试,但实际测试执行总是至少需要1分钟,就像每次都在运行所有迁移一样。
Problem #2
我需要测试一段代码进入catch(Exception $e)分支的场景,这段代码会从数据库获取结果,所以我尝试在所有setUp操作后修改表名来触发异常——这一步确实成功了。
但问题来了:同一个测试类中后续测试相同代码的用例全部失败,报错信息为SQLSTATE[42S02]: Base table or view not found,这说明表名还是被修改后的错误名称。看起来似乎不是单个测试被包裹在事务中,而是整个测试类的所有测试共用了同一个事务?但这又和“之前的数据库操作(比如创建实例)不会影响后续测试”的预期相矛盾。
我实在搞不清楚哪里出了问题,希望能得到帮助。
备注:内容来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

