>我用这段代码进行了测试
Event::fake();
Queue::fake();
// Fake an order
$order = factory(Order::class)->make();
event(new PaymentWasCompleted($order));
Event::assertDispatched(PaymentWasCompleted::class, function ($e) use ($order) {
return $e->order->id === $order->id;
});
Queue::assertPushed(GenerateInvoiceJob::class, function ($job) use ($order) {
return $job->order->id === $order->id;
});
我的事件服务提供商如下所示:
protected $listen = [
AppEventsPaymentWasCompleted::class => [
AppListenersGenerateInvoice::class,
]
];
GenerateInvoice 侦听器如下所示:
public function __construct()
{
$this->eventName = 'GenerateInvoice';
}
public function handle(PaymentWasCompleted $event)
{
// Access the order using $event->order
$order = $event->order;
$job = (new GenerateInvoiceJob($order, $this))->onQueue(app('QueueHelper')->getQueueName($this->eventName));
$this->dispatch($job);
}
我希望测试通过,但它失败了:
未推送预期的 [应用\作业\生成发票作业] 作业。
我不确定为什么会这样。
我也试过
Queue::assertPushedOn(app('QueueHelper')->getQueueName('GenerateInvoice'), GenerateInvoiceJob::class, function ($job) use ($order) {
return $job->order->id === $order->id;
});
同样的问题。
重新阅读文档后,很明显这是预期的行为。文档说
作为模拟的替代方案,您可以使用活动外观的假货 阻止所有事件侦听器执行的方法。
如评论中所述,我必须创建两个测试。一个用于确保事件已触发并包含预期数据,另一个用于确保事件侦听器被触发。
所以,第一个测试:
Event::fake();
$order = factory(Order::class)->make();
event(new PaymentWasCompleted($order));
Event::assertDispatched(PaymentWasCompleted::class, function ($e) use ($order) {
return $e->order->id === $order->id;
});
第二次测试:
Queue::fake();
$order = factory(Order::class)->make();
event(new PaymentWasCompleted($order));
Queue::assertPushed(GenerateInvoiceJob::class, function ($job) use ($order) {
return $job->order->id === $order->id;
});
正如预期的那样,此测试通过。