测试Eloquent观察者的方法是否触发事件。

4

我正在开发的应用程序会在Eloquent模型属性更新时触发一个事件。

Eloquent模型名为Job,当duration属性更新时,它应该触发JobCustomerTotalAmountDueChanged事件。我在JobObserver中编写了以下代码:

public function saved(Job $job)
{
    if ($job->isDirty('duration')) {
        event(new JobCustomerTotalAmountDueChanged($job));
    }
}

当我尝试使用Event::fake进行测试时,Eloquent事件没有被触发,这意味着saved方法中的代码从未执行。据我所见,assertDispatchedassertNotDispatched方法仅适用于伪造的事件。是否有一种方法可以在不使用Event::fake的情况下断言特定事件已/未触发?

1个回答

15

结果证明,解决方法其实非常简单:

Laravel允许您通过fake方法的一个参数来指定哪些事件应该被伪造。在我的例子中:

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

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


我正在使用5.6.26版本,理论上应该可以工作。但是我现在卡住了。 - Jairo
也许你在某个地方调用了没有参数的 Event::fake()?另外,你没有伪造 Eloquent 事件,对吧? - Amade
我刚刚检查了一下,我没有在其他任何地方调用Event::fake()而不带参数。并且,我只是试图伪造我的自定义事件。 - Jairo
1
我想我遇到了和你一样的问题。看起来Eloquent事件没有被触发。不过有一个解决方法。在这里查看最后一个答案(来自2017年11月):https://github.com/laravel/framework/issues/18066 - Amade
谢谢Amade,我现在会使用这个hacky解决方案。 - Jairo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接