我正在编写一些单元测试来测试数据库事务中间件,在异常情况下,事务中的所有内容都应该回滚。这段代码工作得很好,并通过了单元测试:
成功的单元测试方法
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 失败是否有原因?