Тест не повинен слати справжні листи - це повільно, ненадійно й іноді доходить до реальних людей.
Mail::fake() підміняє транспорт і запамʼятовує, що мало піти:
it('sends a welcome letter on registration', function () {
Mail::fake();
$this->post('/register', [
'email' => 'dev@example.com',
'password' => 'password',
]);
Mail::assertSent(WelcomeMail::class, function (WelcomeMail $mail) {
return $mail->hasTo('dev@example.com');
});
});
Є ще assertNotSent(), assertNothingSent() і assertSentCount().
Важлива пастка: якщо лист відправляється через сповіщення ($user->notify(...)), Mail::fake() його не побачить - потрібен Notification::fake() і assertSentTo(). Плутанина між цими двома - найчастіша причина «тест не бачить листа, хоча він точно йде».
Друга пастка: якщо mailable реалізує ShouldQueue, а в тесті стоїть Queue::fake(), лист не дійде до пошти взагалі - перевіряти треба постановку завдання.
Поза тестами для перегляду верстки зручні два інструменти. Драйвер log пише лист у storage/logs, а Mailpit чи Mailtrap ловлять пошту в локальний ящик - листи виглядають як справжні, але нікуди не йдуть.
Ще одна дрібниця: mailable можна відкрити прямо в браузері, повернувши його з маршруту - зручно для правки шаблону без повторних відправлень.
Докладніше в документації: Пошта