Test the notification channel separately from its message
A test asserts that a notification was sent, but the customer still receives nothing because the notification routes to a different channel. Notification dispatch, channel selection, and real delivery are separate boundaries.
Assert the intended recipient and notification
Notification::fake();
$user->notify(new InvoiceReady($invoice));
Notification::assertSentTo($user, InvoiceReady::class);
This fragment assumes application-specific InvoiceReady and invoice fixtures. Add a callback assertion for relevant notification data and channels where useful. A fake intentionally prevents real delivery, so it cannot verify SMTP credentials or provider acceptance.
Exercise the message builder too
Check the generated subject, destination link, and amount formatting through the notification's message-building methods or focused rendering tests. A dispatch assertion can pass while a template throws during real channel processing.
For queued notifications, consider when the invoice transaction commits and whether the worker can load the record. Dispatching before the data is committed can produce a failure that never appears in a synchronous test.
Keep one controlled delivery check for the configured provider when deployment changes mail settings. Report it accurately: queued, accepted by provider, and delivered to an inbox are different observations. Never show a customer “email sent” merely because a log driver wrote the message into a server file. Tests should protect the wording and state your application exposes when delivery cannot be confirmed.