Testing the effect couples the test to the listener, and testing the event tests the thing the code under test is actually responsible for.
// couples this test to whatever the listeners do
Mail::assertSent(OrderShipped::class);
Notification::assertSentTo($user, ShippedNotification::class);
// tests what the service decided
Event::fake([OrderWasShipped::class]);
$this->service->ship($order);
Event::assertDispatched(OrderWasShipped::class,
fn ($e) => $e->order->is($order));
The listener gets its own test, which is a smaller and more focused one — and adding a second listener then breaks no existing test. Event::fake with an explicit list rather than faking everything is the detail that matters, because faking all events silently disables anything else the code depends on.