Класс Bus
Класс Bus предоставляет возможность тестирования
диспетчеризации задач в приложении Laravel. Основное
назначение этого класса - создание фейковой реализации
диспетчера шины, которая позволяет проверить, были ли
отправлены определенные задачи на выполнение, и с какими
данными они были диспетчеризованы. Метод fake
создает фейковую шину, а метод assertDispatched
проверяет, была ли отправлена конкретная задача.
Синтаксис
<?php
Bus::fake();
Bus::assertDispatched($jobClass);
Bus::assertNotDispatched($jobClass);
Bus::assertDispatchedTimes($jobClass, $times);
Bus::assertNothingDispatched();
?>
Пример
Давайте протестируем, что задача 'ProcessOrder'
была успешно диспетчеризована после выполнения метода
контроллера:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Bus;
use App\Jobs\ProcessOrder;
use App\Models\Order;
class OrderControllerTest extends TestCase
{
public function test_order_processing_dispatches_job()
{
Bus::fake();
$order = Order::factory()->create();
$res = $this->post('/api/orders', [
'order_id' => $order->id,
'status' => 'pending'
]);
Bus::assertDispatched(ProcessOrder::class);
}
}
?>
Пример
Проверим, что задача была диспетчеризована с определенными данными, используя замыкание для проверки свойств задачи:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Bus;
use App\Jobs\SendWelcomeEmail;
use App\Models\User;
class UserControllerTest extends TestCase
{
public function test_welcome_email_job_has_correct_data()
{
Bus::fake();
$user = User::factory()->create([
'email' => 'test@example.com'
]);
$res = $this->post('/api/users', [
'name' => 'John Doe',
'email' => 'test@example.com'
]);
Bus::assertDispatched(SendWelcomeEmail::class, function ($job) use ($user) {
return $job->user->id === $user->id;
});
}
}
?>
Пример
Проверим, что задача была диспетчеризована несколько раз, и что определенные задачи не были отправлены:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Bus;
use App\Jobs\ProcessOrder;
use App\Jobs\SendNotification;
use App\Jobs\UpdateInventory;
class BulkProcessingTest extends TestCase
{
public function test_multiple_jobs_dispatched()
{
Bus::fake();
$res = $this->post('/api/bulk-process', [
'order_ids' => [1, 2, 3]
]);
Bus::assertDispatched(ProcessOrder::class, 3);
Bus::assertNotDispatched(SendNotification::class);
Bus::assertDispatchedTimes(UpdateInventory::class, 1);
}
}
?>
Пример
Проверим, что после выполнения запроса не было отправлено никаких задач:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Bus;
use App\Models\Article;
class ArticleControllerTest extends TestCase
{
public function test_read_operation_does_not_dispatch_jobs()
{
Bus::fake();
$article = Article::factory()->create([
'title' => 'test article',
'text' => 'content here'
]);
$res = $this->get('/api/articles/' . $article->id);
Bus::assertNothingDispatched();
}
}
?>
Смотрите также
-
класс
Bus::fake,
который создает фейковую реализацию шины задач -
метод
assertDispatched,
который проверяет, была ли отправлена задача -
класс
Queue,
который используется для тестирования очередей -
класс
Event,
который используется для тестирования событий