Трансляция событий Laravel, имитирующая случайный сбой или успех

#laravel #laravel-8

#laravel #laravel-8

Вопрос:

Я пытаюсь имитировать ShouldBroadcast событие, но иногда тест завершается неудачно, а иногда и успешно. Чтобы быть точным, у меня есть функции тестирования дерева с приведенным ниже кодом, которые случайным образом завершатся неудачей или успехом. Есть какие-нибудь идеи, в чем причина?

Это событие

  class MessageDeleted implements ShouldBroadcast
 {
use Dispatchable, InteractsWithSockets, SerializesModels;

/**
 * @var User
 */
public User $user;
/**
 * @var Message
 */
public Message $message;

/**
 * Create a new event instance.
 *
 * @param User $user
 * @param Message $message
 */
public function __construct(User $user, Message $message)
{
    $this->user = $user;
    $this->message = $message;
}

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PrivateChannel('App.Models.Conversation.' . $this->message->conversation_id);
}
 }
 

Это событие срабатывает в контроллере

     broadcast(new MessageDeleted($user, $message))->toOthers();
 

И это тест

  public function testItCanDeleteMessage()
  {

    $initialEvent = Event::getFacadeRoot();
    Event::fake();
    Model::setEventDispatcher($initialEvent);

    $user = User::factory()->create();

    $conversation = Conversation::factory()->create();

    $message = Message::factory()->create();

    $response = $this->actingAs($user)->deleteJson('/conversations/' . $conversation->id . '/messages/' . $message->id);

    Event::assertDispatched(function (MessageDeleted $event) use ($user, $message) {
        return $event->message->conversation_id === $message->conversation_id;
    });
    
    Event::assertDispatched(MessageDeleted::class, 1);
    
    $response->assertStatus(JsonResponse::HTTP_OK);
    $response->assertJsonStructure([
        'message',
    ]);
}
 

Комментарии:

1. Какая часть терпит неудачу? Может быть, сбой происходит где-то еще в вашем коде? У меня были ситуации, когда тесты «иногда» завершались неудачно, когда были задействованы временные метки, и тест только что прошел второй, после чего некоторые функции начали сбоить.

2. Иногда я получаю Failed asserting that event 'AppEventsMessageUpdated' was broadcast on channel s 'private-App.Models.Conversation.18' 0 events was broadcast: [] Failed asserting that false is true.

3. Извините, но ваш вопрос похож на то, что вы показываете мне закрытую сумку и просите меня сказать, что внутри. Вам нужно будет показать больше кода, что происходит за кулисами. Проанализируйте это, используйте отладчик, запишите все. И т.д.

4. Я обновил вопрос

5. Что происходит, когда вы делаете event(new MessageDeleted(.... вместо broadcast