测试Eloquent Observer的方法是否触发事件

时间:2018-04-17 10:53:36

标签: php unit-testing laravel-5 phpunit laravel-5.5

我正在处理的应用程序在更新其中一个Eloquent模型属性时触发事件。

Eloquent模型称为Job,当JobCustomerTotalAmountDueChanged属性更新时,它应该触发duration。我在JobObserver

中有以下代码
public function saved(Job $job)
{
    if ($job->isDirty('duration')) {
        event(new JobCustomerTotalAmountDueChanged($job));
    }
}

当我尝试使用Event::fake进行测试时,不会触发Eloquent事件,这意味着saved方法中的代码永远不会被执行。从我看到的assertDispatchedassertNotDispatched方法仅适用于伪造事件。有没有办法断言在没有Event::fake的情况下没有触发特定事件?

1 个答案:

答案 0 :(得分:5)

毕竟解决方案非常简单:

Laravel允许您指定哪些事件应该伪造,作为fake方法的参数。在我的例子中:

Event::fake([JobCustomerTotalAmountDueChanged::class])

正在触发和处理所有其他事件。此外,您只能参考作为fake方法的参数传递的事件来进行断言。如果你没有传递任何论点,Laravel将尝试“伪造”应用程序中的每个事件。