Метод fake
Метод fake класса Event применяется в тестах
для имитации работы диспетчера событий. При вызове этого
метода все события, которые будут задиспатчены в процессе
выполнения теста, не будут вызывать свои слушатели,
а вместо этого будут записываться во внутренний массив
для последующей проверки. Метод не принимает обязательных
параметров и возвращает экземпляр фейкового диспетчера
событий.
Синтаксис
<?php
Event::fake();
?>
Пример
Давайте проверим, что событие 'UserRegistered'
было задиспатчено после регистрации пользователя:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\UserRegistered;
use App\Models\User;
use Illuminate\Support\Facades\Event;
class UserRegistrationTest extends TestCase
{
public function test_user_registration_dispatches_event()
{
Event::fake();
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
]);
event(new UserRegistered($user));
Event::assertDispatched(UserRegistered::class);
}
}
?>
Пример
Давайте проверим, что событие 'OrderShipped'
было задиспатчено ровно один раз:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\OrderShipped;
use App\Models\Order;
use Illuminate\Support\Facades\Event;
class OrderTest extends TestCase
{
public function test_order_shipping_dispatches_event_once()
{
Event::fake();
$order = Order::factory()->create();
$order->ship();
Event::assertDispatched(OrderShipped::class, 1);
}
}
?>
Пример
Давайте выполним подмену событий только для определённых классов, чтобы остальные события работали в штатном режиме:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\EmailSent;
use App\Events\EmailFailed;
use Illuminate\Support\Facades\Event;
class EmailTest extends TestCase
{
public function test_specific_events_are_faked()
{
Event::fake([
EmailSent::class,
EmailFailed::class,
]);
// Здесь только EmailSent и EmailFailed будут фейковыми,
// остальные события будут работать нормально
}
}
?>
Пример
Давайте проверим, что событие 'PaymentProcessed'
было задиспатчено с определёнными данными:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\PaymentProcessed;
use App\Models\Payment;
use Illuminate\Support\Facades\Event;
class PaymentTest extends TestCase
{
public function test_payment_event_has_correct_data()
{
Event::fake();
$payment = Payment::factory()->create([
'amount' => 100,
]);
event(new PaymentProcessed($payment));
Event::assertDispatched(function (PaymentProcessed $event) {
return $event->payment->amount === 100;
});
}
}
?>
Пример
Давайте проверим, что событие 'UserDeleted'
не было задиспатчено:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Events\UserDeleted;
use App\Models\User;
use Illuminate\Support\Facades\Event;
class UserTest extends TestCase
{
public function test_user_deletion_does_not_dispatch_event()
{
Event::fake();
$user = User::factory()->create();
// Событие не диспатчится
Event::assertNotDispatched(UserDeleted::class);
}
}
?>
Смотрите также
-
метод
assertDispatched,
который проверяет, было ли событие задиспатчено -
класс
Event,
класс для работы с событиями в тестах -
класс
TestCase,
базовый класс для всех тестов в Laravel -
класс
RefreshDatabase,
трейт для сброса базы данных между тестами