Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Тестирование

После каждой правки нужно убедиться, что вход, оформление заказа и остальные сценарии по-прежнему работают. Проверять это руками долго. 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. Иначе трейт очистит базу, с которой вы работаете.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.