MySQL数据库事务是否使用RefreshDatabase或DatabaseTransactions破坏了Laravel PHPUnit测试?

时间:2019-07-08 01:05:21

标签: mysql laravel laravel-5 transactions phpunit

我正在为项目写一些PHPUnit功能测试。其中之一命中了许多修改数据库的路由-到目前为止,我一直在其中一些路由中使用数据库事务。

如果我在测试中使用RefreshDatabaseDatabaseTransactions特征,它将失败并显示一个奇怪的错误:

Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\ClassM]

如果我删除特征(这样数据将继续存在),则测试通过。

我从相关路径中删除了所有数据库事务,然后通过RefreshDatabase通过了测试。

我的怀疑是问题在于MySQL不支持嵌套事务,并且两个特征都使用事务。但这意味着,如果我想使用RefreshDatabase(到目前为止是最好的选择!)运行测试,我将无法在代码中使用事务。

对吗?似乎是一个主要限制。

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法-似乎有些奇怪。我主要使用“手动”交易方式-例如。

DB::beginTransaction();
try {
    $user = User::create([...]); etc.
    DB::commit();
}
catch (...) {
    DB::rollBack();
}

我只是切换到了关闭方法:

DB::transaction(function () {
    $user = User::create([...]); etc.
});

不知道为什么会解决它!