Метод assertSent
Метод assertSent применяется к экземпляру фасада Mail
в тестах для проверки отправки писем. Первым параметром
передаётся класс отправляемого письма. Вторым параметром -
замыкание, которое получает экземпляр письма и возвращает
true или false в зависимости от условий проверки.
Если замыкание не передано, проверяется только факт отправки
письма указанного класса.
Синтаксис
<?php
Mail::assertSent($mailableClass, $callback);
?>
Пример
Давайте проверим, что при регистрации пользователя отправляется приветственное письмо:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeMail;
use App\Models\User;
class RegistrationTest extends TestCase
{
public function test_welcome_email_is_sent()
{
Mail::fake();
$user = User::factory()->create([
'email' => 'user@example.com',
'name' => 'John Doe'
]);
Mail::assertSent(WelcomeMail::class);
$res = 'Welcome email was sent successfully';
echo $res;
}
}
?>
Результат выполнения кода:
"Welcome email was sent successfully"
Пример
Давайте проверим, что письмо отправлено конкретному пользователю с определённым содержимым:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderShipped;
use App\Models\Order;
class NotificationTest extends TestCase
{
public function test_order_shipped_email_sent_to_correct_user()
{
Mail::fake();
$order = Order::factory()->create([
'email' => 'customer@example.com',
'total' => 100
]);
// Здесь обычно вызывается метод, который отправляет письмо
// Например, OrderController::ship($order)
Mail::assertSent(OrderShipped::class, function ($mail) use ($order) {
return $mail->hasTo($order->email) &&
$mail->order->id === $order->id;
});
$res = 'Order shipped email verified';
echo $res;
}
}
?>
Результат выполнения кода:
"Order shipped email verified"
Пример
Давайте проверим, что при заказе отправляется письмо с подтверждением, и оно содержит правильную сумму:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderConfirmation;
use App\Models\Order;
class OrderTest extends TestCase
{
public function test_order_confirmation_has_correct_total()
{
Mail::fake();
$order = Order::factory()->create([
'total' => 250
]);
// Вызываем метод, отправляющий письмо
// $this->post('/orders', $order->toArray());
Mail::assertSent(OrderConfirmation::class, function ($mail) use ($order) {
return $mail->order->total === $order->total &&
$mail->order->id === $order->id;
});
$res = 'Order confirmation contains correct total';
echo $res;
}
}
?>
Результат выполнения кода:
"Order confirmation contains correct total"
Смотрите также
-
метод
fake,
который подменяет реальную отправку писем на тестовую -
метод
assertSentTo,
который проверяет отправку уведомлений конкретному получателю -
класс
Mail,
который предоставляет функциональность для тестирования почты -
метод
assertPushed,
который проверяет отправку задач в очередь