Laravel Event Mocking - PullRequest
       5

Laravel Event Mocking

0 голосов
/ 14 мая 2018

У меня есть тест с этим кодом

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 выглядит следующим образом:

   protected $listen = [
        \App\Events\PaymentWasCompleted::class => [
            \App\Listeners\GenerateInvoice::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);
    }

Я ожидаю, что тест пройдёт, но он не пройдёт:

Ожидаемое задание [App \ Jobs \ GenerateInvoiceJob] не было отправлено.

Я не уверен, почему это так.

Я тоже пробовал

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

тот же вопрос.

1 Ответ

0 голосов
/ 14 мая 2018

После перечитывания документов становится ясно, что это предполагаемое поведение.Документы говорят:

В качестве альтернативы насмешкам, вы можете использовать поддельный метод Event фасад, чтобы запретить выполнение всех слушателей событий.

Как описано в комментарии, ядолжны создать два теста.Один для того, чтобы убедиться, что событие было запущено и содержит ожидаемые данные, а второй для того, чтобы убедиться, что слушатели события были запущены.

Итак, первый тест:

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

Второйtest:

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

Как и ожидалось, этот тест пройден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...