Php 测试雄辩的观察者的方法是否触发事件

Php 测试雄辩的观察者的方法是否触发事件,php,unit-testing,laravel-5,phpunit,laravel-5.5,Php,Unit Testing,Laravel 5,Phpunit,Laravel 5.5,当一个雄辩的模型属性被更新时,我正在开发的应用程序会触发一个事件 雄辩的模型被称为Job,当duration属性更新时,它应该触发JobCustomerTotalAmountDueChanged。我在JobObserver中有以下代码: public function saved(Job $job) { if ($job->isDirty('duration')) { event(new JobCustomerTotalAmountDueChanged($job))

当一个雄辩的模型属性被更新时,我正在开发的应用程序会触发一个事件

雄辩的模型被称为
Job
,当
duration
属性更新时,它应该触发
JobCustomerTotalAmountDueChanged
。我在
JobObserver
中有以下代码:

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

当我尝试使用
Event::fake
对其进行测试时,不会触发有说服力的事件,这意味着
saved
方法中的代码永远不会执行。据我所见,
assertDispatched
assertNotDispatched
方法仅适用于伪造事件。有没有一种方法可以断言在没有
event::fake
的情况下是否触发了特定事件?

解决方案最终证明非常简单:

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

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

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

Amade,我正在尝试传递参数我的特定事件,您知道为什么即使这样做,模型事件也不会被触发吗?我使用的是Spatial/laravel sluggable软件包,没有生成slug,因为没有启动创建方法,这会导致mysql错误,因为slug字段不能为null。这是在laravel 5.5中添加的。你用的是哪个版本?我用的是5.6.26,所以理论上应该可以。我被困在这里了也许你在某处调用Event::fake()而没有参数?还有,你不是在假装雄辩的事件,对吧?我想我只是遇到了和你一样的问题。看起来有说服力的事件没有被解雇。不过,有一个解决办法。请在此处查看最后一个答案(2017年11月起):