Класс Event
Класс Event в Laravel используется для тестирования событий. Он позволяет подменить реальную систему событий на фейковую, чтобы проверить, что определённые события были отправлены. Метод fake отключает реальную отправку событий, а методы assertDispatched и assertNotDispatched позволяют проверить, были ли отправлены определённые события.
Синтаксис
<?php
Event::fake();
Event::assertDispatched(EventClass::class);
?>
Пример
Давайте протестируем отправку события при регистрации пользователя:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Events\UserRegistered;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
public function register(Request $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
event(new UserRegistered($user));
return response()->json(['message' => 'User registered']);
}
}
?>
Тест для проверки отправки события:
<?php
namespace Tests\Feature\Auth;
use Tests\TestCase;
use App\Events\UserRegistered;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\RefreshDatabase;
class RegisterTest extends TestCase
{
use RefreshDatabase;
public function test_user_registered_event_is_dispatched()
{
Event::fake();
$response = $this->post('/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123'
]);
Event::assertDispatched(UserRegistered::class);
$response->assertStatus(200);
}
}
?>
Результат выполнения кода:
"Test passed: UserRegistered event was dispatched"
Пример
Проверим, что событие не было отправлено с помощью метода assertNotDispatched:
<?php
namespace Tests\Feature\Auth;
use Tests\TestCase;
use App\Events\UserRegistered;
use App\Events\UserLoggedIn;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\RefreshDatabase;
class RegisterTest extends TestCase
{
use RefreshDatabase;
public function test_user_logged_in_event_is_not_dispatched()
{
Event::fake();
$response = $this->post('/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123'
]);
Event::assertNotDispatched(UserLoggedIn::class);
$response->assertStatus(200);
}
}
?>
Результат выполнения кода:
"Test passed: UserLoggedIn event was not dispatched"
Пример
Проверим, что событие было отправлено с определёнными данными с помощью замыкания:
<?php
namespace Tests\Feature\Auth;
use Tests\TestCase;
use App\Events\UserRegistered;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\RefreshDatabase;
class RegisterTest extends TestCase
{
use RefreshDatabase;
public function test_user_registered_event_has_correct_user_data()
{
Event::fake();
$response = $this->post('/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123'
]);
Event::assertDispatched(function (UserRegistered $event) {
return $event->user->email === 'john@example.com';
});
$response->assertStatus(200);
}
}
?>
Результат выполнения кода:
"Test passed: UserRegistered event has correct user data"
Смотрите также
-
метод
fake,
который подменяет систему событий на фейковую -
метод
assertDispatched,
который проверяет, что событие было отправлено -
класс
TestCase,
базовый класс для всех тестов в Laravel -
класс
RefreshDatabase,
который обеспечивает чистоту базы данных в тестах