Тестирование
После каждой правки нужно убедиться, что вход, оформление заказа и остальные сценарии по-прежнему работают. Проверять это руками долго. Laravel позволяет описать сценарий кодом: тест сам отправляет запрос и проверяет ответ.
Создание теста
php artisan make:test PostTestФайл появится в tests/Feature. Тесты из этой папки проверяют приложение целиком: маршрут, контроллер, базу и шаблон.
Проверка страницы
namespace Tests\Feature;
use Tests\TestCase;
class PostTest extends TestCase
{
public function test_home_page_opens(): void
{
$response = $this->get('/');
$response->assertStatus(200);
$response->assertSee('Добро пожаловать');
}
}Метод get() отправляет запрос внутри приложения — настоящий сервер не нужен. Имя метода теста начинается с test.
Тесты с базой данных
Трейт RefreshDatabase перед тестами создаёт таблицы в отдельной тестовой базе и возвращает её в исходное состояние после каждого теста. Данные готовят фабриками:
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;
class PostTest extends TestCase
{
use RefreshDatabase;
public function test_post_page_shows_title(): void
{
$post = Post::factory()->create(['title' => 'Первая статья']);
$this->get("/posts/{$post->id}")
->assertOk()
->assertSee('Первая статья');
}
}От имени пользователя
actingAs() выполняет запрос так, будто пользователь уже вошёл:
public function test_guest_cannot_create_post(): void
{
$this->post('/posts', ['title' => 'Тест'])->assertRedirect('/login');
}
public function test_user_can_create_post(): void
{
$user = User::factory()->create();
$this->actingAs($user)
->post('/posts', ['title' => 'Тест', 'body' => 'Текст'])
->assertRedirect('/posts');
$this->assertDatabaseHas('posts', ['title' => 'Тест']);
}assertDatabaseHas() проверяет, что запись действительно появилась в таблице.
Проверка валидации и API
public function test_title_is_required(): void
{
$user = User::factory()->create();
$this->actingAs($user)
->post('/posts', ['title' => ''])
->assertSessionHasErrors('title');
}
public function test_api_returns_posts(): void
{
Post::factory()->count(3)->create();
$this->getJson('/api/posts')
->assertOk()
->assertJsonCount(3, 'data');
}Запуск
php artisan test
php artisan test --filter=PostTestПервая команда запускает все тесты, вторая — только указанный класс.
Частая ошибка
Без RefreshDatabase тесты пишут в базу и мешают друг другу: второй запуск падает, потому что запись с такой почтой уже существует. И убедитесь, что тесты работают с отдельной базой — она задаётся в файле phpunit.xml. Иначе трейт очистит базу, с которой вы работаете.