Два різні питання - «чи відправлено подію» і «чи правильно працює слухач» - тестують окремо.
Чи відправлено:
Event::fake([OrderShipped::class]);
$this->post("/orders/{$order->id}/ship")->assertOk();
Event::assertDispatched(OrderShipped::class, fn ($e) => $e->order->is($order));
Передавати список подій важливо: Event::fake() без аргументів підмінить усі події, зокрема події моделей. Тоді зламається все, що тримається на creating - генерація UUID, slug, спостерігачі - і тест впаде з дивною помилкою.
Інші інструменти:
Event::fakeExcept([...])- підмінити все, крім переліченого;Event::fakeFor(fn () => ...)- лише для частини тесту;Event::assertListening(OrderShipped::class, SendShipmentNotification::class)- що слухач підписаний.
Чи правильно працює слухач - окремий тест, де слухач викликають напряму:
(new SendShipmentNotification)->handle(new OrderShipped($order));
Notification::assertSentTo($order->customer, ShipmentSent::class);
Варто мати й кілька тестів без підмін, де ланцюжок «дія → подія → слухач» проходить цілком: саме там ламаються інтеграції, які фейки приховують.