Класс TestCase
Класс TestCase является основой тестирования в Laravel.
Все создаваемые тестовые классы должны наследовать его.
Он предоставляет методы для взаимодействия с приложением,
работы с базой данных, отправки HTTP-запросов и выполнения
проверок утверждений. Основное предназначение этого класса -
обеспечить удобную среду для написания и выполнения тестов.
Создание тестового класса
Для создания тестового класса используется artisan-команда
make:test. После создания класс должен наследовать
TestCase и содержать методы, начинающиеся с префикса
test или использовать аннотацию @test.
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_can_be_created()
{
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password'),
]);
$this->assertDatabaseHas('users', [
'email' => 'john@example.com',
]);
}
}
?>
Метод setUp
Метод setUp выполняется перед каждым тестом.
Он используется для инициализации общих данных,
создания объектов или настройки окружения.
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Article;
class ArticleTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
Article::create([
'title' => 'Test Article',
'content' => 'Test content',
'status' => 'published',
]);
}
public function test_article_exists()
{
$article = Article::where('title', 'Test Article')->first();
$this->assertNotNull($article);
}
}
?>
Метод tearDown
Метод tearDown выполняется после каждого теста.
Он используется для очистки данных или освобождения ресурсов.
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
protected function tearDown(): void
{
User::truncate();
parent::tearDown();
}
public function test_user_count()
{
$count = User::count();
$this->assertEquals(0, $count);
}
}
?>
Трейт RefreshDatabase
Трейт RefreshDatabase автоматически обновляет
базу данных перед каждым тестом, используя миграции.
Это гарантирует, что каждый тест начинается с чистой базы.
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\Post;
class PostTest extends TestCase
{
use RefreshDatabase;
public function test_post_creation()
{
$post = Post::create([
'title' => 'New Post',
'content' => 'Post content',
'user_id' => 1,
]);
$this->assertDatabaseHas('posts', [
'title' => 'New Post',
]);
}
}
?>
Трейт WithFaker
Трейт WithFaker предоставляет доступ к библиотеке
Faker для генерации случайных данных в тестах.
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
class FactoryTest extends TestCase
{
use WithFaker;
public function test_faker_usage()
{
$name = $this->faker->name();
$email = $this->faker->email();
$this->assertIsString($name);
$this->assertStringContainsString('@', $email);
}
}
?>
Метод actingAs
Метод actingAs используется для аутентификации
пользователя в тестах. Он позволяет выполнять запросы
от имени конкретного пользователя.
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
class AuthTest extends TestCase
{
public function test_authenticated_user()
{
$user = User::create([
'name' => 'Admin',
'email' => 'admin@example.com',
'password' => bcrypt('password'),
]);
$response = $this->actingAs($user)
->get('/dashboard');
$response->assertStatus(200);
}
}
?>
Методы HTTP-запросов
Класс TestCase предоставляет методы для выполнения
HTTP-запросов: get, post, put,
patch, delete. Они позволяют тестировать
маршруты и контроллеры.
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ArticleControllerTest extends TestCase
{
public function test_get_articles()
{
$response = $this->get('/api/articles');
$response->assertStatus(200);
}
public function test_create_article()
{
$data = [
'title' => 'New Article',
'content' => 'Article content',
'status' => 'draft',
];
$response = $this->post('/api/articles', $data);
$response->assertStatus(201);
$this->assertDatabaseHas('articles', $data);
}
}
?>
Метод seed
Метод seed используется для заполнения базы данных
тестовыми данными. Он может принимать имя класса сидера
или вызывать все сидеры без параметров.
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\Category;
class DatabaseTest extends TestCase
{
use RefreshDatabase;
public function test_seeded_categories()
{
$this->seed('CategorySeeder');
$count = Category::count();
$this->assertGreaterThan(0, $count);
}
}
?>
Смотрите также
-
метод
setUp,
который выполняется перед каждым тестом -
метод
tearDown,
который выполняется после каждого теста -
трейт
RefreshDatabase,
который автоматически обновляет базу данных -
метод
actingAs,
который аутентифицирует пользователя в тестах