Я пишу некоторые модульные тесты для тестирования промежуточного программного обеспечения транзакции базы данных, за исключением того, что все внутри транзакции должно выполнить откат. И этот кусок кода прекрасно работает и проходит модульный тест:
Метод модульного теста, который успешно
public function testTransactionShouldRollback()
{
Event::fake();
// Ignore the exception so the test itself can continue.
$this->expectException('Exception');
$this->middleware->handle($this->request, function () {
throw new Exception('Transaction should fail');
});
Event::assertDispatched(TransactionRolledBack::class);
}
И все же всякий раз, когда я тестирую событие TransactionBeginning
, не удается подтвердить, что событие было отправлено.
Метод модульного теста, который не проходит
public function testTransactionShouldBegin()
{
Event::fake();
$this->middleware->handle($this->request, function () {
return $this->response;
});
Event::assertDispatched(TransactionBeginning::class);
}
Фактическое промежуточное ПО
public function handle($request, Closure $next)
{
DB::beginTransaction();
try {
$response = $next($request);
if ($response->exception) {
throw $response->exception;
}
} catch (Throwable $e) {
DB::rollBack();
throw $e;
}
if (!$response->exception) {
DB::commit();
}
return $response;
}
Все события транзакции инициируют события, поэтому DB::beginTransaction, DB::rollBack, DB::commit
должны запускать все события. Тем не менее, когда я тестирую, я вижу только срабатывание события отката транзакции.
Есть ли причина, по которой другие события не запускаются в этом случае и мой assertDispatched не выполняется?