Підмінити відповідний фасад фейком: він перехопить відправку, а тест перевірить, що вона сталася з правильними даними.
it('notifies the customer when the order ships', function () {
Notification::fake();
Mail::fake();
Queue::fake();
$order = Order::factory()->create();
$order->ship();
Notification::assertSentTo($order->customer, OrderShipped::class);
Mail::assertSent(InvoiceMail::class, fn ($mail) => $mail->hasTo($order->customer->email));
Queue::assertPushed(SyncWithWarehouse::class);
});
Які фейки є: Mail, Notification, Queue, Bus (бачить ще й ланцюжки й пакети), Event, Storage, Http, Process, Exceptions.
Пастки:
Event::fake()без аргументів глушить усі події, включно з подіями моделей, на яких можуть триматися генерація UUID чиObserver. Підробляйте лише потрібні:Event::fake([OrderShipped::class]).- Фейк не перевіряє, що робота виконується.
Queue::assertPushed()доводить, що завдання поставлено, але не що йогоhandle()працює. Код самого завдання тестують окремо - викликаючи його напряму. - Mailable можна перевірити без відправки:
(new InvoiceMail($order))->assertSeeInHtml($order->number).