Laravel事件模拟 [英] Laravel Event Mocking

查看:78
本文介绍了Laravel事件模拟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用此代码进行了测试

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

我的EventServiceProvider看起来像这样:

My EventServiceProvider looks like this:

   protected $listen = [
        \App\Events\PaymentWasCompleted::class => [
            \App\Listeners\GenerateInvoice::class,
        ]
    ];

GenerateInvoice侦听器如下所示:

And the GenerateInvoice listener looks like this:

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

我希望测试能够通过,但失败:

I would expect the test to be passing, but it fails with:

未推送预期的[App \ Jobs \ GenerateInvoiceJob]作业.

The expected [App\Jobs\GenerateInvoiceJob] job was not pushed.

我不确定为什么会这样.

I am unsure why that is.

我也尝试过

Queue::assertPushedOn(app('QueueHelper')->getQueueName('GenerateInvoice'), GenerateInvoiceJob::class, function ($job) use ($order) {
            return $job->order->id === $order->id;
        });

同一期问题.

推荐答案

重新阅读文档后,很明显这是预期的行为.文档说

After re-reading the docs, it is clear that this is intended behaviour. The docs say

作为模拟的替代方法,您可以使用事件外观的伪造阻止所有事件侦听器执行的方法.

As an alternative to mocking, you may use the Event facade's fake method to prevent all event listeners from executing.

如评论中所述,我必须创建两个测试.一种用于确保事件已被触发并包含预期的数据,另一种用于确保事件监听器被触发.

As described in a comment, I have to create two tests. One for making sure that the event has been fired and contains the expected data and a second one for making sure that the event listeners get fired.

所以,第一次测试:

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

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

As expected, this tests pass.

这篇关于Laravel事件模拟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆