Метод fake
Метод fake класса Queue применяется в тестах Laravel для подмены реального драйвера очереди на фейковый. Это позволяет тестировать отправку заданий в очередь без их фактического выполнения, что значительно ускоряет выполнение тестов. Метод возвращает экземпляр фасада Queue, который можно использовать для последующих проверок.
Первым параметром метод fake принимает массив классов заданий, для которых требуется подмена. Если массив не передан, подмена применяется ко всем заданиям. Вторым параметром можно передать замыкание для дополнительной настройки поведения фейковой очереди.
Синтаксис
<?php
Queue::fake($jobs = [], $handler = null);
?>
Пример
Давайте протестируем отправку задания в очередь при регистрации пользователя:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Jobs\SendWelcomeEmail;
use App\Models\User;
use Illuminate\Support\Facades\Queue;
class UserRegistrationTest extends TestCase
{
public function test_welcome_email_is_queued()
{
Queue::fake();
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password')
]);
SendWelcomeEmail::dispatch($user);
Queue::assertPushed(SendWelcomeEmail::class);
}
}
?>
Результат выполнения кода:
"Test passed: Assertion successful"
Пример
Рассмотрим подмену очереди только для конкретного задания:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Jobs\ProcessOrder;
use App\Jobs\SendOrderConfirmation;
use App\Models\Order;
use Illuminate\Support\Facades\Queue;
class OrderProcessingTest extends TestCase
{
public function test_order_confirmation_is_sent()
{
Queue::fake([ProcessOrder::class]);
$order = Order::create([
'user_id' => 1,
'total' => 100,
'status' => 'pending'
]);
SendOrderConfirmation::dispatch($order);
ProcessOrder::dispatch($order);
Queue::assertPushed(ProcessOrder::class);
Queue::assertNotPushed(SendOrderConfirmation::class);
}
}
?>
Результат выполнения кода:
"Test passed: ProcessOrder pushed, SendOrderConfirmation not pushed"
Пример
Использование метода fake с обработчиком для управления заданиями:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Jobs\SendNotification;
use App\Models\User;
use Illuminate\Support\Facades\Queue;
class NotificationTest extends TestCase
{
public function test_notification_job_handling()
{
Queue::fake([], function ($job) {
if ($job instanceof SendNotification) {
$job->handle();
}
return $job;
});
$user = User::find(1);
SendNotification::dispatch($user, 'Test message');
Queue::assertPushed(SendNotification::class);
}
}
?>
Результат выполнения кода:
"Test passed: Notification job executed"
Смотрите также
-
метод
assertPushed,
который проверяет, что задание было помещено в очередь -
класс
Queue,
который предоставляет методы для работы с очередями в тестах -
метод
fakeкласса Event,
который подменяет события в тестах -
метод
fakeкласса Mail,
который подменяет отправку писем в тестах