我正在为项目写一些PHPUnit功能测试。其中之一命中了许多修改数据库的路由-到目前为止,我一直在其中一些路由中使用数据库事务。
如果我在测试中使用RefreshDatabase
或DatabaseTransactions
特征,它将失败并显示一个奇怪的错误:
Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\ClassM]
如果我删除特征(这样数据将继续存在),则测试通过。
我从相关路径中删除了所有数据库事务,然后通过RefreshDatabase
通过了测试。
我的怀疑是问题在于MySQL不支持嵌套事务,并且两个特征都使用事务。但这意味着,如果我想使用RefreshDatabase
(到目前为止是最好的选择!)运行测试,我将无法在代码中使用事务。
对吗?似乎是一个主要限制。
答案 0 :(得分:0)
我找到了一种解决方法-似乎有些奇怪。我主要使用“手动”交易方式-例如。
DB::beginTransaction();
try {
$user = User::create([...]); etc.
DB::commit();
}
catch (...) {
DB::rollBack();
}
我只是切换到了关闭方法:
DB::transaction(function () {
$user = User::create([...]); etc.
});
不知道为什么会解决它!