Метод fake
Метод fake класса Mail применяется в тестах для перехвата всех отправляемых писем и предотвращения их реальной отправки. Вместо отправки через почтовый драйвер, письма сохраняются в памяти, что позволяет выполнять проверки с помощью метода assertSent. Метод не принимает параметров и возвращает экземпляр фасада Mail.
Синтаксис
<?php
Mail::fake();
?>
Пример 1
Давайте создадим тест для регистрации пользователя, при которой отправляется приветственное письмо:
<?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_after_registration()
{
Mail::fake();
$response = $this->post('/register', [
'email' => 'john@example.com',
'password' => 'secret123',
'name' => 'John Doe'
]);
Mail::assertSent(WelcomeMail::class);
$user = User::where('email', 'john@example.com')->first();
$this->assertNotNull($user);
}
}
?>
Пример 2
Давайте проверим, что письмо отправляется с правильными данными, используя замыкание:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderConfirmation;
use App\Models\Order;
use App\Models\User;
class OrderTest extends TestCase
{
public function test_order_confirmation_email_has_correct_data()
{
Mail::fake();
$user = User::factory()->create();
$order = Order::factory()->create([
'user_id' => $user->id,
'total' => 99.99
]);
$response = $this->actingAs($user)
->post('/orders/' . $order->id . '/confirm');
Mail::assertSent(OrderConfirmation::class, function ($mail) use ($order) {
return $mail->order->id === $order->id
&& $mail->hasTo('john@example.com');
});
}
}
?>
Пример 3
Давайте проверим, что письмо не было отправлено в определённых условиях:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderConfirmation;
use App\Models\Order;
use App\Models\User;
class OrderTest extends TestCase
{
public function test_email_not_sent_for_invalid_order()
{
Mail::fake();
$user = User::factory()->create();
$order = Order::factory()->create([
'user_id' => $user->id,
'status' => 'pending'
]);
$response = $this->actingAs($user)
->post('/orders/' . $order->id . '/cancel');
Mail::assertNotSent(OrderConfirmation::class);
}
}
?>
Смотрите также
-
метод
assertSent,
который проверяет отправку письма -
метод
fakeкласса Notification,
который подменяет отправку уведомлений -
метод
fakeкласса Queue,
который подменяет отправку задач в очередь -
метод
fakeкласса Event,
который подменяет отправку событий