Как проверить/утвердить, транслируется ли событие в Laravel

Я разрабатываю приложение Laravel. Я использую Laravel Broadcast в своем приложении. Сейчас я пытаюсь проверить, транслируется ли событие в Laravel.

Я транслирую такое событие:

broadcast(new NewItemCreated($item));

Я хочу проверить, транслируется ли событие. Как я могу проверить это? Я имею в виду модульный тест. Я хочу сделать что-то вроде

Broadcast::assertSent(NewItemCreated::class) 

Дополнительная информация

Это событие передается в рамках события наблюдателя, которое запускается при создании элемента.


person Wai Yan Hein    schedule 16.09.2019    source источник


Ответы (4)


Я думаю, что вы можете относиться к трансляции более или менее как к событиям, поэтому вы можете обратиться к этому разделу документации.

person mdexp    schedule 16.09.2019

Я думаю, вы можете добиться этого с помощью Mocking в Laravel (Event Fake)

<?php

namespace Tests\Feature;

use App\Events\NewItemCreated;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Event;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Test create item.
     */
    public function testOrderShipping()
    {
        // this is important
        Event::fake();

        // Perform item creation...

        Event::assertDispatched(NewItemCreated::class, function ($e) {
            return $e->name === 'test' ;
        });

        // Assert an event was dispatched twice...
        Event::assertDispatched(NewItemCreated::class, 2);

        // Assert an event was not dispatched...
        Event::assertNotDispatched(NewItemCreated::class);
    }
}
person Michael Nguyen    schedule 16.09.2019

Если вы транслируете свое событие с помощью broadcast($event), эта функция вызовет метод event Broadcasting Factory, который вы можете имитировать, например так:

$this->mock(\Illuminate\Contracts\Broadcasting\Factory::class)
        ->shouldReceive('event')
        ->with(NewItemCreated::class)
        ->once();

// Processing logic here

Не уверен, что это лучший способ добиться этого, но это единственный, который сработал для меня.

person Geni Jaho    schedule 30.04.2021

Если вы используете широковещательный драйвер log, просто зарегистрируйте свой файл /storage/log/some_name.log. Вы можете найти что-то вроде этого:

[2019-09-16 18:33:46] local.INFO: Broadcasting [test] on channels [test-channel] with payload:
{
    "test": "test",
    "socket": null
}  

Если ваш водитель pusher, войдите в свою учетную запись Pusher и перейдите на панель инструментов. Выберите свое приложение и нажмите Debug Console. Там вы найдете событие.

Надеюсь, поможет.

person Mateus Junges    schedule 16.09.2019