Прерывают ли транзакции базы данных MySQL тесты Laravel PHPUnit, используя RefreshDatabase или DatabaseTransactions? - PullRequest
0 голосов
/ 08 июля 2019

Я запоздало пишу некоторые тесты функций PHPUnit для проекта.Один из них затрагивает несколько маршрутов, которые изменяют базу данных - и до сих пор я использовал транзакции базы данных на некоторых из этих маршрутов.

Если я использую черту RefreshDatabase или DatabaseTransactions вмой тест проваливается со странной ошибкой:

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

Если я удаляю признаки (чтобы данные сохранялись), тест проходит успешно.

Я прошел и удалил всю свою базу данныхтранзакции от соответствующих маршрутов, и тест теперь проходит с RefreshDatabase.

Я подозреваю, что проблема в том, что MySQL не поддерживает вложенные транзакции, и обе черты используют транзакции,Но это означало бы, что если я хочу запустить тесты с RefreshDatabase (безусловно, лучший вариант!), Я вообще не могу использовать транзакции в своем коде.

Это правильно?Это кажется серьезным ограничением.

1 Ответ

0 голосов
/ 08 июля 2019

Я нашел обходной путь - и это кажется немного странным. Я в основном использовал «ручные» методы транзакций - например,

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

Я просто переключился на метод закрытия:

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

Понятия не имею, почему бы это исправить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...