Не следуя тому, как тестировать широковещательные события в laravel

Итак, рассмотрим следующее событие:

class UpdateApprovedClinicianCountBroadcastEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets;

    public $count;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(int $count)
    {
        $this->count = $count;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PresenceChannel('approved-clinician-count');
    }
}

Здесь ничего сложного.

Итак, согласно документам, я предполагаю протестировать это событие следующим образом:

public function testBroadCastShouldEmit() {
    Event::fake();

    $count = 1;

    Event::assertDispatched(UpdateApprovedClinicianCountBroadcastEvent::class, function ($e) use ($count) {
        $e->count === $count;
    });
}

Но я получаю:

Tests \ Unit \ Health \ Datasets \ Builders \ UpdateApprovedClinicianCountBroadcastEventTest x должен выдать [0,360 с]

Время: 503 мс, Память: 30,00 МБ

Произошел 1 сбой:

1) Tests \ Unit \ Health \ Datasets \ Builders \ UpdateApprovedClinicianCountBroadcastEventTest :: testBroadCastShouldEmit Ожидаемое событие [App \ Modules \ Clinics \ Events \ UpdateApprovedClinicianCountBroadcastEvent] не было отправлено. Не удалось подтвердить, что ложь истинна.

/Users/xxx/Documents/health/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/EventFake.php:62 / Users / xxx / Documents / health / vendor / laravel / framework / src / Illuminate / Support /Facades/Facade.php:261 /Users/xxx/Documents/health/tests/Unit/Modules/Clinics/Events/UpdateApprovedClinicianCountBroadcastEventTest.php:31

Итак, как вы тестируете трансляции событий? Могу ли я вызвать событие? Вызывает ли это меня этот метод отправки? Как будто я запутался.


person TheWebs    schedule 27.01.2020    source источник


Ответы (1)


Из документации laravel:

Чтобы отправить событие, вы можете передать экземпляр события помощнику по событию. Помощник отправит событие всем своим зарегистрированным слушателям. Поскольку помощник по событию доступен по всему миру, вы можете вызывать его из любого места в приложении:

event(new UpdateApprovedClinicianCountBroadcastEvent($count))

И проверка будет выглядеть следующим образом, чтобы подтвердить, что он был отправлен:

public function testBroadCastShouldEmit() {
    event(new UpdateApprovedClinicianCountBroadcastEvent(1))
    Event::assertDispatched(UpdateApprovedClinicianCountBroadcastEvent::class)
}
person Alex Harris    schedule 27.01.2020
comment
Вы не можете просто вызвать широковещательную рассылку, как вы, они должны быть подделаны, потому что, когда я это делаю, она пытается физически отправить широковещательную рассылку и терпит неудачу с исключением. Как бы то ни было, подделка не работает, потому что никогда не отправляется. - person TheWebs; 29.01.2020