Класс Mail
Класс Mail в Laravel предоставляет удобный способ тестирования отправки писем. Основная задача этого класса - подменить реальный почтовый драйвер на фиктивный и предоставить методы для проверки, что письма были отправлены с правильными параметрами. Для использования класса необходимо импортировать фасад Mail через пространство имён IlluminateSupportFacadesMail.
Класс Mail содержит следующие основные методы: fake - для подмены реальной отправки писем, assertSent - для проверки, что письмо было отправлено, assertNotSent - для проверки, что письмо не было отправлено, и assertSentTo - для проверки получателя письма.
Синтаксис
<?php
Mail::fake();
Mail::assertSent($mailableClass);
Mail::assertNotSent($mailableClass);
Mail::assertSentTo($recipient, $mailableClass);
?>
Пример
Давайте создадим тест для проверки отправки письма после регистрации пользователя:
<?php
namespace TestsFeature;
use TestsTestCase;
use AppModelsUser;
use AppMailWelcomeMail;
use IlluminateSupportFacadesMail;
class RegistrationTest extends TestCase
{
public function test_welcome_email_is_sent()
{
Mail::fake();
$user = User::factory()->create([
'email' => 'user@example.com',
]);
Mail::to($user->email)->send(new WelcomeMail($user));
Mail::assertSent(WelcomeMail::class);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Давайте проверим, что письмо было отправлено конкретному пользователю:
<?php
namespace TestsFeature;
use TestsTestCase;
use AppModelsUser;
use AppMailWelcomeMail;
use IlluminateSupportFacadesMail;
class RegistrationTest extends TestCase
{
public function test_email_sent_to_correct_user()
{
Mail::fake();
$user = User::factory()->create([
'email' => 'user@example.com',
]);
Mail::to($user->email)->send(new WelcomeMail($user));
Mail::assertSentTo($user, WelcomeMail::class);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Давайте проверим, что письмо с уведомлением о смене пароля не было отправлено:
<?php
namespace TestsFeature;
use TestsTestCase;
use AppMailPasswordChangedMail;
use IlluminateSupportFacadesMail;
class PasswordTest extends TestCase
{
public function test_password_change_email_not_sent()
{
Mail::fake();
// Выполняем действие, которое НЕ должно отправить письмо
$res = $this->post('/api/update-profile', [
'name' => 'John Doe',
]);
Mail::assertNotSent(PasswordChangedMail::class);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Давайте проверим содержимое отправленного письма с помощью замыкания:
<?php
namespace TestsFeature;
use TestsTestCase;
use AppModelsUser;
use AppMailWelcomeMail;
use IlluminateSupportFacadesMail;
class RegistrationTest extends TestCase
{
public function test_welcome_email_has_correct_content()
{
Mail::fake();
$user = User::factory()->create([
'email' => 'user@example.com',
'name' => 'John Doe',
]);
Mail::to($user->email)->send(new WelcomeMail($user));
Mail::assertSent(WelcomeMail::class, function ($mail) use ($user) {
return $mail->hasTo($user->email) &&
$mail->greeting === 'Welcome John Doe';
});
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Смотрите также
-
метод
fake,
который подменяет реальную отправку писем -
метод
assertSent,
который проверяет, что письмо было отправлено -
класс
Notification,
который используется для тестирования уведомлений -
класс
Queue,
который используется для тестирования очередей