<? phpukraine ДОКУМЕНТАЦІЯ
Пошук по платформі
Документація українською

Переклад офіційної документації українською. Кожен розділ показує стан готовності: недоперекладене позначене відкрито, а не приховане.

ВЕРСІЯ
АКТУАЛЬНА Актуальний реліз. Переклад наздоганяє оригінал, розділи з низьким відсотком позначені у змісті.
ТЕСТУВАННЯ · ЧАСТКОВО частковий переклад, оновлено 15 вересня 2026

HTTP-тести · Laravel

ПЕРЕКЛАД НЕПОВНИЙ

Частину підрозділів ще не перекладено, вони показані англійською нижче в тексті або лишились в оригіналі. Готові фрагменти вже перевірені редактором.

Вступ

Laravel надає дуже плавний API для створення HTTP-запитів до вашого застосунку та перевірки відповідей. Погляньте, наприклад, на такий функціональний тест:

<?php

test('the application returns a successful response', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад тесту.
     */
    public function test_the_application_returns_a_successful_response(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Метод get виконує GET-запит до застосунку, а метод assertStatus стверджує, що повернута відповідь має вказаний HTTP-статус. Крім цього простого твердження, Laravel має цілий набір тверджень для перевірки заголовків відповіді, її вмісту, структури JSON тощо.

Створення запитів

Щоб виконати запит до застосунку, викличте в тесті методи get, post, put, patch або delete. Ці методи не виконують «справжнього» HTTP-запиту до вашого застосунку: весь мережевий запит симулюється всередині.

Замість екземпляра Illuminate\Http\Response тестові методи запитів повертають екземпляр Illuminate\Testing\TestResponse, який надає набір корисних тверджень для перевірки відповідей вашого застосунку:

<?php

test('basic request', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад тесту.
     */
    public function test_a_basic_request(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Зазвичай кожен тест має виконувати лише один запит до застосунку. Якщо в одному тестовому методі виконати кілька запитів, поведінка може виявитися несподіваною.

Примітка Для зручності CSRF middleware автоматично вимикається під час запуску тестів.

Налаштування заголовків запиту

Метод withHeaders дає змогу налаштувати заголовки запиту перед його надсиланням до застосунку. Цим методом можна додати до запиту будь-які власні заголовки:

<?php

test('interacting with headers', function () {
    $response = $this->withHeaders([
        'X-Header' => 'Value',
    ])->post('/user', ['name' => 'Sally']);

    $response->assertStatus(201);
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад функціонального тесту.
     */
    public function test_interacting_with_headers(): void
    {
        $response = $this->withHeaders([
            'X-Header' => 'Value',
        ])->post('/user', ['name' => 'Sally']);

        $response->assertStatus(201);
    }
}

Cookies

Щоб задати значення cookie перед виконанням запиту, скористайтеся методами withCookie або withCookies. Метод withCookie приймає двома аргументами назву та значення cookie, а withCookies - масив пар «назва / значення»:

<?php

test('interacting with cookies', function () {
    $response = $this->withCookie('color', 'blue')->get('/');

    $response = $this->withCookies([
        'color' => 'blue',
        'name' => 'Taylor',
    ])->get('/');

    //
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_interacting_with_cookies(): void
    {
        $response = $this->withCookie('color', 'blue')->get('/');

        $response = $this->withCookies([
            'color' => 'blue',
            'name' => 'Taylor',
        ])->get('/');

        //
    }
}

Сесія / автентифікація

Laravel має кілька хелперів для роботи з сесією під час HTTP-тестування. Спершу, ви можете задати дані сесії з масиву за допомогою методу withSession. Це зручно, коли перед запитом до застосунку сесію треба наповнити даними:

<?php

test('interacting with the session', function () {
    $response = $this->withSession(['banned' => false])->get('/');

    //
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_interacting_with_the_session(): void
    {
        $response = $this->withSession(['banned' => false])->get('/');

        //
    }
}

Сесія Laravel зазвичай зберігає стан поточного автентифікованого користувача. Тому хелпер actingAs дає простий спосіб автентифікувати вказаного користувача як поточного. Наприклад, згенеруємо й автентифікуємо користувача через фабрику моделі:

<?php

use App\Models\User;

test('an action that requires authentication', function () {
    $user = User::factory()->create();

    $response = $this->actingAs($user)
        ->withSession(['banned' => false])
        ->get('/');

    //
});
<?php

namespace Tests\Feature;

use App\Models\User;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_an_action_that_requires_authentication(): void
    {
        $user = User::factory()->create();

        $response = $this->actingAs($user)
            ->withSession(['banned' => false])
            ->get('/');

        //
    }
}

Ви також можете вказати, який guard використовувати для автентифікації користувача, передавши назву guard другим аргументом методу actingAs. Переданий у actingAs guard стане guard за замовчуванням на час тесту:

$this->actingAs($user, 'web');

Якщо треба переконатися, що запит виконується без автентифікації, скористайтеся методом actingAsGuest:

$this->actingAsGuest();

Налагодження відповідей

Після виконання тестового запиту методи dump, dumpHeaders і dumpSession допоможуть оглянути й налагодити вміст відповіді:

<?php

test('basic test', function () {
    $response = $this->get('/');

    $response->dump();
    $response->dumpHeaders();
    $response->dumpSession();
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад тесту.
     */
    public function test_basic_test(): void
    {
        $response = $this->get('/');

        $response->dump();
        $response->dumpHeaders();
        $response->dumpSession();
    }
}

Або ж методи dd, ddHeaders, ddBody, ddJson і ddSession виведуть інформацію про відповідь і зупинять виконання:

<?php

test('basic test', function () {
    $response = $this->get('/');

    $response->dd();
    $response->ddHeaders();
    $response->ddBody();
    $response->ddJson();
    $response->ddSession();
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад тесту.
     */
    public function test_basic_test(): void
    {
        $response = $this->get('/');

        $response->dd();
        $response->ddHeaders();
        $response->ddBody();
        $response->ddJson();
        $response->ddSession();
    }
}

Обробка винятків

Іноді потрібно перевірити, що застосунок кидає конкретний виняток. Для цього можна «підмінити» обробник винятків через фасад Exceptions. Після підміни обробника методи assertReported і assertNotReported дають змогу робити твердження про винятки, кинуті під час запиту:

<?php

use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;

test('exception is thrown', function () {
    Exceptions::fake();

    $response = $this->get('/order/1');

    // Стверджуємо, що виняток було кинуто...
    Exceptions::assertReported(InvalidOrderException::class);

    // Робимо твердження про сам виняток...
    Exceptions::assertReported(function (InvalidOrderException $e) {
        return $e->getMessage() === 'The order was invalid.';
    });
});
<?php

namespace Tests\Feature;

use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад тесту.
     */
    public function test_exception_is_thrown(): void
    {
        Exceptions::fake();

        $response = $this->get('/');

        // Стверджуємо, що виняток було кинуто...
        Exceptions::assertReported(InvalidOrderException::class);

        // Робимо твердження про сам виняток...
        Exceptions::assertReported(function (InvalidOrderException $e) {
            return $e->getMessage() === 'The order was invalid.';
        });
    }
}

Методи assertNotReported і assertNothingReported стверджують, що вказаний виняток не був кинутий під час запиту або що винятків не було взагалі:

Exceptions::assertNotReported(InvalidOrderException::class);

Exceptions::assertNothingReported();

Обробку винятків для конкретного запиту можна повністю вимкнути, викликавши метод withoutExceptionHandling перед запитом:

$response = $this->withoutExceptionHandling()->get('/');

Крім того, якщо ви хочете переконатися, що застосунок не використовує можливостей, застарілих у мові PHP чи в бібліотеках вашого застосунку, викличте перед запитом метод withoutDeprecationHandling. З вимкненою обробкою застарілостей попередження про них перетворюються на винятки, через що тест впаде:

$response = $this->withoutDeprecationHandling()->get('/');

Метод assertThrows стверджує, що код усередині переданого замикання кидає виняток вказаного типу:

$this->assertThrows(
    fn () => (new ProcessOrder)->execute(),
    OrderInvalid::class
);

Якщо ви хочете оглянути кинутий виняток і зробити про нього твердження, передайте замикання другим аргументом методу assertThrows:

$this->assertThrows(
    fn () => (new ProcessOrder)->execute(),
    fn (OrderInvalid $e) => $e->orderId() === 123;
);

Метод assertDoesntThrow стверджує, що код усередині переданого замикання не кидає жодних винятків:

$this->assertDoesntThrow(fn () => (new ProcessOrder)->execute());

Тестування JSON API

Laravel також надає кілька хелперів для тестування JSON API та їхніх відповідей. Наприклад, методи json, getJson, postJson, putJson, patchJson, deleteJson і optionsJson виконують JSON-запити різними HTTP-дієсловами. Цим методам легко передати дані й заголовки. Для початку напишемо тест, що робить POST-запит до /api/user і стверджує, що повернулися очікувані JSON-дані:

<?php

test('making an api request', function () {
    $response = $this->postJson('/api/user', ['name' => 'Sally']);

    $response
        ->assertStatus(201)
        ->assertJson([
            'created' => true,
        ]);
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад функціонального тесту.
     */
    public function test_making_an_api_request(): void
    {
        $response = $this->postJson('/api/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}

До того ж дані JSON-відповіді доступні як елементи масиву на самому обʼєкті відповіді, тож окремі значення з JSON зручно перевіряти напряму:

expect($response['created'])->toBeTrue();
$this->assertTrue($response['created']);

Примітка Метод assertJson перетворює відповідь на масив, щоб перевірити наявність переданого масиву в JSON-відповіді застосунку. Тож якщо в JSON-відповіді є інші властивості, тест усе одно пройде, доки переданий фрагмент присутній.

Твердження про точний збіг JSON

Як уже згадано, метод assertJson перевіряє наявність фрагмента JSON у відповіді. Якщо треба переконатися, що переданий масив точно збігається з JSON, який повертає ваш застосунок, використовуйте метод assertExactJson:

<?php

test('asserting an exact json match', function () {
    $response = $this->postJson('/user', ['name' => 'Sally']);

    $response
        ->assertStatus(201)
        ->assertExactJson([
            'created' => true,
        ]);
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад функціонального тесту.
     */
    public function test_asserting_an_exact_json_match(): void
    {
        $response = $this->postJson('/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertExactJson([
                'created' => true,
            ]);
    }
}

Твердження про шляхи в JSON

Якщо потрібно перевірити, що JSON-відповідь містить певні дані за вказаним шляхом, скористайтеся методом assertJsonPath:

<?php

test('asserting a json path value', function () {
    $response = $this->postJson('/user', ['name' => 'Sally']);

    $response
        ->assertStatus(201)
        ->assertJsonPath('team.owner.name', 'Darian');
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Базовий приклад функціонального тесту.
     */
    public function test_asserting_a_json_paths_value(): void
    {
        $response = $this->postJson('/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJsonPath('team.owner.name', 'Darian');
    }
}

Метод assertJsonPath також приймає замикання, яким можна динамічно визначити, чи має твердження пройти:

$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);

Якщо потрібно перевірити кілька JSON-шляхів одразу, скористайтеся методом assertJsonPaths. Очікуваним значенням для кожного шляху теж може бути замикання:

$response->assertJsonPaths([
    'team.owner.name' => 'Darian',
    'team.owner.email' => fn (string $email) => str($email)->is('*@laravel.com'),
    'team.members.0.name' => 'Sally',
]);

Метод assertJsonMissingPaths стверджує, що у відповіді немає кількох JSON-шляхів:

$response->assertJsonMissingPaths([
    'team.owner.password',
    'team.members.0.api_token',
]);

Плавне тестування JSON

Laravel пропонує ще й гарний спосіб плавно тестувати JSON-відповіді застосунку. Для початку передайте замикання в метод assertJson. Це замикання буде викликано з екземпляром Illuminate\Testing\Fluent\AssertableJson, через який можна робити твердження про повернутий застосунком JSON. Метод where перевіряє окремий атрибут JSON, а метод missing стверджує, що конкретного атрибута в JSON немає:

use Illuminate\Testing\Fluent\AssertableJson;

test('fluent json', function () {
    $response = $this->getJson('/users/1');

    $response
        ->assertJson(fn (AssertableJson $json) =>
            $json->where('id', 1)
                ->where('name', 'Victoria Faith')
                ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                ->whereNot('status', 'pending')
                ->missing('password')
                ->etc()
        );
});
use Illuminate\Testing\Fluent\AssertableJson;

/**
 * Базовий приклад функціонального тесту.
 */
public function test_fluent_json(): void
{
    $response = $this->getJson('/users/1');

    $response
        ->assertJson(fn (AssertableJson $json) =>
            $json->where('id', 1)
                ->where('name', 'Victoria Faith')
                ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                ->whereNot('status', 'pending')
                ->missing('password')
                ->etc()
        );
}

Як працює метод etc

У прикладі вище ви могли помітити виклик методу etc наприкінці ланцюжка тверджень. Цей метод повідомляє Laravel, що в JSON-обʼєкті можуть бути й інші атрибути. Без etc тест впаде, якщо в JSON-обʼєкті знайдуться атрибути, яких ви не перевірили.

Така поведінка захищає вас від випадкового розкриття чутливої інформації в JSON-відповідях: ви змушені або явно зробити твердження про атрибут, або явно дозволити додаткові атрибути через etc.

Проте памʼятайте: відсутність etc у ланцюжку тверджень не гарантує, що додаткові атрибути не додаються до масивів, вкладених у ваш JSON-обʼєкт. Метод etc гарантує відсутність додаткових атрибутів лише на тому рівні вкладеності, де його викликано.

Твердження про наявність / відсутність атрибута

Щоб стверджувати, що атрибут присутній або відсутній, використовуйте методи has і missing:

$response->assertJson(fn (AssertableJson $json) =>
    $json->has('data')
        ->missing('message')
);

Крім того, методи hasAll і missingAll дають змогу перевірити наявність або відсутність кількох атрибутів одночасно:

$response->assertJson(fn (AssertableJson $json) =>
    $json->hasAll(['status', 'data'])
        ->missingAll(['message', 'code'])
);

Методом hasAny можна визначити, чи присутній хоча б один атрибут із переданого списку:

$response->assertJson(fn (AssertableJson $json) =>
    $json->has('status')
        ->hasAny('data', 'message', 'code')
);

Твердження про JSON-колекції

Часто маршрут повертає JSON-відповідь із кількома елементами, наприклад кількома користувачами:

Route::get('/users', function () {
    return User::all();
});

У таких випадках метод has плавного JSON-обʼєкта дає змогу робити твердження про користувачів у відповіді. Наприклад, перевіримо, що JSON-відповідь містить трьох користувачів. Далі зробимо кілька тверджень про першого користувача в колекції через метод first. Метод first приймає замикання, яке отримує ще один обʼєкт для тверджень про перший елемент JSON-колекції:

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has(3)
            ->first(fn (AssertableJson $json) =>
                $json->where('id', 1)
                    ->where('name', 'Victoria Faith')
                    ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                    ->missing('password')
                    ->etc()
            )
    );

Якщо ті самі твердження треба застосувати до кожного елемента JSON-колекції, скористайтеся методом each:

$response
  ->assertJson(fn (AssertableJson $json) =>
      $json->has(3)
          ->each(fn (AssertableJson $json) =>
              $json->whereType('id', 'integer')
                  ->whereType('name', 'string')
                  ->whereType('email', 'string')
                  ->missing('password')
                  ->etc()
          )
  );

Обмеження області тверджень про JSON-колекції

Іноді маршрути вашого застосунку повертають JSON-колекції, привʼязані до іменованих ключів:

Route::get('/users', function () {
    return [
        'meta' => [...],
        'users' => User::all(),
    ];
})

Тестуючи такі маршрути, методом has можна перевірити кількість елементів у колекції. А ще has обмежує область для ланцюжка тверджень:

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
            ->has('users', 3)
            ->has('users.0', fn (AssertableJson $json) =>
                $json->where('id', 1)
                    ->where('name', 'Victoria Faith')
                    ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                    ->missing('password')
                    ->etc()
            )
    );

Проте замість двох окремих викликів has для колекції users можна зробити один виклик, передавши замикання третім параметром. Тоді замикання буде викликано автоматично з областю, обмеженою першим елементом колекції:

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
            ->has('users', 3, fn (AssertableJson $json) =>
                $json->where('id', 1)
                    ->where('name', 'Victoria Faith')
                    ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                    ->missing('password')
                    ->etc()
            )
    );

Твердження про типи в JSON

Іноді достатньо перевірити, що властивості JSON-відповіді мають певний тип. Клас Illuminate\Testing\Fluent\AssertableJson надає для цього методи whereType і whereAllType:

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('id', 'integer')
        ->whereAllType([
            'users.0.name' => 'string',
            'meta' => 'array'
        ])
);

Кілька типів вказують через символ | або передають масив типів другим параметром методу whereType. Твердження буде успішним, якщо значення у відповіді має будь-який із перелічених типів:

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('name', 'string|null')
        ->whereType('id', ['string', 'integer'])
);

Методи whereType і whereAllType розпізнають такі типи: string, integer, double, boolean, array і null.

Тестування завантаження файлів

Клас Illuminate\Http\UploadedFile має метод fake, яким можна згенерувати фіктивні файли або зображення для тестування. У парі з методом fake фасаду Storage це дуже спрощує тестування завантаження файлів. Наприклад, поєднавши ці дві можливості, легко протестувати форму завантаження аватара:

<?php

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

test('avatars can be uploaded', function () {
    Storage::fake('avatars');

    $file = UploadedFile::fake()->image('avatar.jpg');

    $response = $this->post('/avatar', [
        'avatar' => $file,
    ]);

    Storage::disk('avatars')->assertExists($file->hashName());
});
<?php

namespace Tests\Feature;

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_avatars_can_be_uploaded(): void
    {
        Storage::fake('avatars');

        $file = UploadedFile::fake()->image('avatar.jpg');

        $response = $this->post('/avatar', [
            'avatar' => $file,
        ]);

        Storage::disk('avatars')->assertExists($file->hashName());
    }
}

Якщо треба ствердити, що певного файлу не існує, скористайтеся методом assertMissing фасаду Storage:

Storage::fake('avatars');

// ...

Storage::disk('avatars')->assertMissing('missing.jpg');

Налаштування фіктивних файлів

Створюючи файли методом fake класу UploadedFile, можна вказати ширину, висоту та розмір зображення (у кілобайтах), щоб краще перевірити правила валідації застосунку:

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

Окрім зображень, методом create можна створювати файли будь-якого іншого типу:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);

За потреби передайте методу аргумент $mimeType, щоб явно визначити MIME-тип, який має повертати файл:

UploadedFile::fake()->create(
    'document.pdf', $sizeInKilobytes, 'application/pdf'
);

Тестування представлень

Laravel також дає змогу відрендерити представлення (view) без симульованого HTTP-запиту до застосунку. Для цього викличте в тесті метод view. Метод view приймає назву представлення та необовʼязковий масив даних. Він повертає екземпляр Illuminate\Testing\TestView, який має кілька методів для зручних тверджень про вміст представлення:

<?php

test('a welcome view can be rendered', function () {
    $view = $this->view('welcome', ['name' => 'Taylor']);

    $view->assertSee('Taylor');
});
<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_a_welcome_view_can_be_rendered(): void
    {
        $view = $this->view('welcome', ['name' => 'Taylor']);

        $view->assertSee('Taylor');
    }
}

Клас TestView надає такі методи тверджень: assertSee, assertSeeInOrder, assertSeeText, assertSeeTextInOrder, assertDontSee і assertDontSeeText.

За потреби сирий відрендерений вміст представлення можна отримати, привівши екземпляр TestView до рядка:

$contents = (string) $this->view('welcome');

Передавання помилок

Деякі представлення залежать від помилок, доступних у глобальному контейнері помилок Laravel. Щоб наповнити цей контейнер повідомленнями про помилки, використайте метод withViewErrors:

$view = $this->withViewErrors([
    'name' => ['Please provide a valid name.']
])->view('form');

$view->assertSee('Please provide a valid name.');

Рендеринг Blade і компонентів

За потреби методом blade можна обчислити й відрендерити сирий рядок Blade. Як і view, метод blade повертає екземпляр Illuminate\Testing\TestView:

$view = $this->blade(
    '<x-component :name="$name" />',
    ['name' => 'Taylor']
);

$view->assertSee('Taylor');

Метод component обчислює й рендерить компонент Blade. Він повертає екземпляр Illuminate\Testing\TestComponent:

$view = $this->component(Profile::class, ['name' => 'Taylor']);

$view->assertSee('Taylor');

Кешування маршрутів

Перед запуском тесту Laravel піднімає свіжий екземпляр застосунку, зокрема збирає всі оголошені маршрути. Якщо у вашому застосунку багато файлів маршрутів, варто додати до тестових класів трейт Illuminate\Foundation\Testing\WithCachedRoutes. У тестах із цим трейтом маршрути збираються один раз і зберігаються в памʼяті, тобто збір колекції маршрутів відбувається лише раз на весь набір тестів:

<?php

use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;

pest()->use(WithCachedRoutes::class);

test('basic example', function () {
    $this->get(action([UserController::class, 'index']));

    // ...
});
<?php

namespace Tests\Feature;

use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;
use Tests\TestCase;

class BasicTest extends TestCase
{
    use WithCachedRoutes;

    /**
     * Базовий приклад функціонального тесту.
     */
    public function test_basic_example(): void
    {
        $response = $this->get(action([UserController::class, 'index']));

        // ...
    }
}

Доступні твердження

Твердження про відповідь

Клас Laravel Illuminate\Testing\TestResponse надає набір власних методів тверджень, які знадобляться під час тестування застосунку. Ці твердження доступні на відповіді, яку повертають тестові методи json, get, post, put і delete:

assertAccepted assertBadRequest assertClientError assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertExactJsonStructure assertFailedDependency assertForbidden assertFound assertGone assertHeader assertHeaderContains assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonPaths assertJsonMissingPath assertJsonMissingPaths assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertMethodNotAllowed assertMovedPermanently assertContent assertNoContent assertStreamed assertStreamedContent assertNotFound assertOk assertPaymentRequired assertPlainCookie assertRedirect assertRedirectBack assertRedirectBackWithErrors assertRedirectBackWithoutErrors assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertServiceUnavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertSessionMissingInput assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing

assertAccepted

Ствердити, що відповідь має HTTP-статус accepted (202):

$response->assertAccepted();

assertBadRequest

Ствердити, що відповідь має HTTP-статус bad request (400):

$response->assertBadRequest();

assertClientError

Ствердити, що відповідь має HTTP-статус помилки клієнта (>= 400, < 500):

$response->assertClientError();

assertConflict

Ствердити, що відповідь має HTTP-статус conflict (409):

$response->assertConflict();

Ствердити, що відповідь містить вказану cookie:

$response->assertCookie($cookieName, $value = null);

Ствердити, що відповідь містить вказану cookie і термін її дії минув:

$response->assertCookieExpired($cookieName);

Ствердити, що відповідь містить вказану cookie і термін її дії не минув:

$response->assertCookieNotExpired($cookieName);

Ствердити, що відповідь не містить вказаної cookie:

$response->assertCookieMissing($cookieName);

assertCreated

Ствердити, що відповідь має HTTP-статус 201:

$response->assertCreated();

assertDontSee

Ствердити, що переданий рядок не міститься у відповіді застосунку. Це твердження автоматично екранує переданий рядок, якщо другим аргументом не передати false:

$response->assertDontSee($value, $escape = true);

assertDontSeeText

Ствердити, що переданий рядок не міститься в тексті відповіді. Це твердження автоматично екранує переданий рядок, якщо другим аргументом не передати false. Перед перевіркою метод пропускає вміст відповіді через PHP-функцію strip_tags:

$response->assertDontSeeText($value, $escape = true);

assertDownload

Ствердити, що відповідь є «завантаженням». Зазвичай це означає, що викликаний маршрут повернув відповідь Response::download, BinaryFileResponse або Storage::download:

$response->assertDownload();

За бажання можна ствердити, що файлу для завантаження призначено певне імʼя:

$response->assertDownload('image.jpg');

assertExactJson

Ствердити, що відповідь точно збігається з переданими JSON-даними:

$response->assertExactJson(array $data);

assertExactJsonStructure

Ствердити, що відповідь точно збігається з переданою структурою JSON:

$response->assertExactJsonStructure(array $data);

Цей метод - суворіший варіант assertJsonStructure. На відміну від assertJsonStructure, він впаде, якщо у відповіді є будь-які ключі, не включені явно до очікуваної структури JSON.

assertFailedDependency

Ствердити, що відповідь має HTTP-статус failed dependency (424):

$response->assertFailedDependency();

assertForbidden

Ствердити, що відповідь має HTTP-статус forbidden (403):

$response->assertForbidden();

assertFound

Ствердити, що відповідь має HTTP-статус found (302):

$response->assertFound();

assertGone

Ствердити, що відповідь має HTTP-статус gone (410):

$response->assertGone();

assertHeader

Ствердити, що у відповіді присутній вказаний заголовок із вказаним значенням:

$response->assertHeader($headerName, $value = null);

assertHeaderContains

Ствердити, що вказаний заголовок містить заданий підрядок:

$response->assertHeaderContains($headerName, $value);

assertHeaderMissing

Ствердити, що у відповіді немає вказаного заголовка:

$response->assertHeaderMissing($headerName);

assertInternalServerError

Ствердити, що відповідь має HTTP-статус «Internal Server Error» (500):

$response->assertInternalServerError();

assertJson

Ствердити, що відповідь містить передані JSON-дані:

$response->assertJson(array $data, $strict = false);

Метод assertJson перетворює відповідь на масив, щоб перевірити наявність переданого масиву в JSON-відповіді застосунку. Тож якщо в JSON-відповіді є інші властивості, тест усе одно пройде, доки переданий фрагмент присутній.

assertJsonCount

Ствердити, що JSON відповіді має за вказаним ключем масив з очікуваною кількістю елементів:

$response->assertJsonCount($count, $key = null);

assertJsonFragment

Ствердити, що відповідь містить передані JSON-дані будь-де у відповіді:

Route::get('/users', function () {
    return [
        'users' => [
            [
                'name' => 'Taylor Otwell',
            ],
        ],
    ];
});

$response->assertJsonFragment(['name' => 'Taylor Otwell']);

assertJsonIsArray

Ствердити, що JSON відповіді є масивом:

$response->assertJsonIsArray();

assertJsonIsObject

Ствердити, що JSON відповіді є обʼєктом:

$response->assertJsonIsObject();

assertJsonMissing

Ствердити, що відповідь не містить переданих JSON-даних:

$response->assertJsonMissing(array $data);

assertJsonMissingExact

Ствердити, що відповідь не містить точно таких JSON-даних:

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

Ствердити, що у відповіді немає JSON-помилок валідації для вказаних ключів:

$response->assertJsonMissingValidationErrors($keys);

Примітка Загальніший метод assertValid стверджує, що у відповіді немає помилок валідації, повернутих у форматі JSON, і що жодних помилок не було записано в сесію.

assertJsonPath

Ствердити, що відповідь містить вказані дані за заданим шляхом:

$response->assertJsonPath($path, $expectedValue);

Наприклад, якщо ваш застосунок повертає таку JSON-відповідь:

{
    "user": {
        "name": "Steve Schoger"
    }
}

Перевірити, що властивість name обʼєкта user дорівнює певному значенню, можна так:

$response->assertJsonPath('user.name', 'Steve Schoger');

assertJsonPaths

Ствердити, що відповідь містить вказані дані за заданими шляхами:

$response->assertJsonPaths(array $paths);

Наприклад, можна перевірити кілька значень у відповіді одразу:

$response->assertJsonPaths([
    'user.name' => 'Steve Schoger',
    'user.email' => fn (string $email) => str($email)->endsWith('@laravel.com'),
]);

assertJsonMissingPath

Ствердити, що відповідь не містить вказаного шляху:

$response->assertJsonMissingPath($path);

Наприклад, якщо ваш застосунок повертає таку JSON-відповідь:

{
    "user": {
        "name": "Steve Schoger"
    }
}

Можна ствердити, що в ній немає властивості email обʼєкта user:

$response->assertJsonMissingPath('user.email');

assertJsonMissingPaths

Ствердити, що відповідь не містить вказаних шляхів:

$response->assertJsonMissingPaths($paths);

Наприклад, можна ствердити, що у відповіді бракує кількох шляхів:

$response->assertJsonMissingPaths([
    'user.email',
    'user.password',
]);

assertJsonStructure

Ствердити, що відповідь має вказану структуру JSON:

$response->assertJsonStructure(array $structure);

Наприклад, якщо JSON-відповідь вашого застосунку містить такі дані:

{
    "user": {
        "name": "Steve Schoger"
    }
}

Перевірити, що структура JSON відповідає очікуванням, можна так:

$response->assertJsonStructure([
    'user' => [
        'name',
    ]
]);

Іноді JSON-відповіді застосунку містять масиви обʼєктів:

{
    "user": [
        {
            "name": "Steve Schoger",
            "age": 55,
            "location": "Earth"
        },
        {
            "name": "Mary Schoger",
            "age": 60,
            "location": "Earth"
        }
    ]
}

У такому разі символ * дає змогу перевірити структуру всіх обʼєктів масиву:

$response->assertJsonStructure([
    'user' => [
        '*' => [
             'name',
             'age',
             'location'
        ]
    ]
]);

assertJsonValidationErrors

Ствердити, що відповідь містить вказані JSON-помилки валідації для заданих ключів. Цей метод варто використовувати, коли перевіряються відповіді, у яких помилки валідації повертаються структурою JSON, а не записуються в сесію:

$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');

Not yet translated: assertJsonValidationErrorFor, assertLocation, assertMethodNotAllowed, assertMovedPermanently, assertContent, assertNoContent, assertStreamed, assertStreamedContent, assertNotFound, assertOk, assertPaymentRequired, assertPlainCookie, assertRedirect, assertRedirectBack, assertRedirectBackWithErrors, assertRedirectBackWithoutErrors, assertRedirectContains, assertRedirectToRoute, assertRedirectToSignedRoute, assertRequestTimeout, assertSee, assertSeeInOrder, assertSeeText, assertSeeTextInOrder, assertServerError, assertServiceUnavailable, assertSessionHas, assertSessionHasInput, assertSessionHasAll, assertSessionHasErrors, assertSessionHasErrorsIn, assertSessionHasNoErrors, assertSessionDoesntHaveErrors, assertSessionMissing, assertSessionMissingInput, assertStatus, assertSuccessful, assertTooManyRequests, assertUnauthorized, assertUnprocessable, assertUnsupportedMediaType, assertValid, assertInvalid, assertViewHas, assertViewHasAll, assertViewIs, assertViewMissing, Authentication Assertions, Validation Assertions.

ЯК ЦЯ СТОРІНКА ВИГЛЯДАЄ В ПОШУКУ
phpukraine.com/docs/laravel/http-tests
HTTP-тести | Документація Laravel українською
HTTP-тести у Laravel 13.x: переклад офіційної документації українською. Оновлено 15 вересня 2026. Приклади коду, пояснення та посилання на питання зі співбесід.
Стан перекладу

Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.

90%
Готовності
10
У роботі
0
Ще не перекладено
Глосарій термінів