拉拉维尔事件嘲讽



>我用这段代码进行了测试

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;
});

正如预期的那样,此测试通过。

相关内容

  • 没有找到相关文章

最新更新