Метод assertDispatched
Метод assertDispatched применяется к экземпляру фасада
Event для проверки диспетчеризации событий в тестах.
Первым параметром передаётся класс события, вторым необязательным
параметром может быть замыкание, которое определяет дополнительные
условия проверки. Метод возвращает объект, содержащий информацию
о диспетчеризованном событии.
Синтаксис
<?php
Event::assertDispatched($eventClass, $callback = null);
?>
Пример
Давайте проверим, что событие 'UserRegistered'
было диспетчеризовано после регистрации пользователя:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Event;
use App\Events\UserRegistered;
use App\Models\User;
class RegistrationTest extends TestCase
{
public function test_registration_dispatches_user_registered_event()
{
Event::fake();
$userData = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123'
];
$response = $this->post('/register', $userData);
Event::assertDispatched(UserRegistered::class);
}
}
?>
Результат выполнения кода:
"Test passed"
В этом примере мы предварительно фейкуем события с помощью
Event::fake, выполняем запрос на регистрацию,
а затем проверяем, что событие было диспетчеризовано.
Пример
Давайте проверим, что событие 'OrderCreated'
было диспетчеризовано с определёнными данными:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Event;
use App\Events\OrderCreated;
use App\Models\Order;
use App\Models\User;
class OrderTest extends TestCase
{
public function test_order_created_event_has_correct_data()
{
Event::fake();
$user = User::factory()->create();
$orderData = [
'user_id' => $user->id,
'total' => 100.50,
'status' => 'pending'
];
$response = $this->actingAs($user)
->post('/orders', $orderData);
Event::assertDispatched(OrderCreated::class, function ($event) use ($orderData) {
return $event->order->total === $orderData['total']
&& $event->order->status === $orderData['status'];
});
}
}
?>
Результат выполнения кода:
"Test passed"
Здесь мы используем замыкание во втором параметре для проверки конкретных свойств диспетчеризованного события.
Пример
Давайте проверим количество диспетчеризованных событий с помощью дополнительных методов:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Event;
use App\Events\UserUpdated;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_update_dispatches_event_once()
{
Event::fake();
$user = User::factory()->create();
$response = $this->actingAs($user)
->put('/users/' . $user->id, [
'name' => 'Updated Name'
]);
Event::assertDispatched(UserUpdated::class, 1);
}
}
?>
Результат выполнения кода:
"Test passed"
В этом примере мы проверяем, что событие было диспетчеризовано ровно один раз.
Смотрите также
-
класс
Event,
который используется для работы с событиями в тестах -
метод
fake,
который позволяет фейковать события в тестах -
метод
assertPushed,
который проверяет отправку задач в очередь -
метод
assertSent,
который проверяет отправку писем