【问题标题】:Do MySQL database transactions break Laravel PHPUnit tests using RefreshDatabase or DatabaseTransactions?MySQL 数据库事务是否会使用 RefreshDatabase 或 DatabaseTransactions 破坏 Laravel PHPUnit 测试?
【发布时间】:2019-11-17 12:23:54
【问题描述】:

我正在为一个项目编写一些 PHPUnit 功能测试,这是姗姗来迟。其中之一命中了许多修改数据库的路由 - 直到现在,我一直在其中一些路由中使用数据库事务。

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

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

如果我删除特征(因此数据将保持不变),则测试通过。

我检查并从相关路由中删除了我的所有数据库事务,现在测试确实通过RefreshDatabase

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

正确吗?这似乎是一个主要限制。

【问题讨论】:

    标签: mysql laravel laravel-5 transactions phpunit


    【解决方案1】:

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

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

    我只是切换到了闭包方式:

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

    不知道为什么会修复它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2020-04-10
      • 2020-11-03
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多