Тести HTTP

Вступ

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);
}
}

Загалом, кожен з ваших тестів повинен виконувати лише один запит до вашого застосунку. Несподівана поведінка може виникнути, якщо кілька запитів виконуються в межах одного методу тестування.

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

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

Ви можете використовувати метод 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

Ви можете використовувати методи withCookie або withCookies для встановлення значень cookie перед виконанням запиту. Метод 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. Guard, який передається методу actingAs, також стане guard за замовчуванням на час тесту:

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

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

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

<?php
 
test('basic test', function () {
$response = $this->get('/');
 
$response->dumpHeaders();
 
$response->dumpSession();
 
$response->dump();
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* Базовий приклад тесту.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
 
$response->dumpHeaders();
 
$response->dumpSession();
 
$response->dump();
}
}

Альтернативно, ви можете використовувати методи 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-відповіді є інші властивості, цей тест все одно пройде, якщо вказаний фрагмент присутній.

Asserting Exact JSON Matches

Як згадувалося раніше, метод assertJson може бути використаний для перевірки, що фрагмент JSON існує в 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,
]);
}
}

Asserting on JSON Paths

Якщо ви хочете перевірити, що 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

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('example@example.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('example@example.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}

Розуміння методу etc

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

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

Однак, ви повинні знати, що не включення методу etc у ваш ланцюжок тверджень не гарантує, що додаткові атрибути не додаються до масивів, які вкладені у ваш JSON об'єкт. Метод etc лише гарантує, що на рівні вкладеності, на якому викликається метод etc, не існує додаткових атрибутів.

Asserting Attribute Presence / Absence

Щоб перевірити, чи атрибут присутній або відсутній, ви можете використовувати методи 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')
);

Asserting Against JSON Collections

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

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

У цих ситуаціях ми можемо використовувати метод has об'єкта JSON для перевірки користувачів, включених у відповідь. Наприклад, давайте перевіримо, що JSON-відповідь містить трьох користувачів. Далі ми зробимо деякі перевірки щодо першого користувача в колекції, використовуючи метод first. Метод first приймає замикання, яке отримує інший об'єкт JSON, що можна використовувати для перевірок першого об'єкта в 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('example@example.com'))
                    ->missing('password')
                    ->etc()
            )
    );

Scoping JSON Collection Assertions

Іноді маршрути вашого застосунку повертатимуть 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('example@example.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('example@example.com'))
                    ->missing('password')
                    ->etc()
            )
    );

Asserting JSON Types

Ви можете захотіти лише перевірити, що властивості у 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 File Customization

Коли створюєте файли за допомогою методу 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 також дозволяє відобразити представлення без здійснення симульованого 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');

Sharing Errors

Деякі представлення можуть залежати від помилок, що передаються в глобальний контейнер помилок, наданий 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. Метод component повертає екземпляр Illuminate\Testing\TestComponent:

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

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

Перевірки Відповідей

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

assertAccepted

Переконайтеся, що відповідь має прийнятий (202) HTTP статус-код:

$response->assertAccepted();

assertBadRequest

Переконайтеся, що відповідь має статусний код HTTP "поганий запит" (400):

$response->assertBadRequest();

assertClientError

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

$response->assertClientError();

assertConflict

Переконайтеся, що відповідь має статусний код конфлікту (409) HTTP:

$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.

assertForbidden

Переконайтеся, що відповідь має заборонений (403) HTTP статус-код:

$response->assertForbidden();

assertFound

Переконайтеся, що відповідь має знайдений (302) HTTP статус-код:

$response->assertFound();

assertGone

Переконайтеся, що відповідь має статусний код HTTP "зникло" (410):

$response->assertGone();

assertHeader

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

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

assertHeaderMissing

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

$response->assertHeaderMissing($headerName);

assertInternalServerError

Переконайтеся, що відповідь має HTTP статус-код "Внутрішня помилка сервера" (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');

assertJsonMissingPath

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

$response->assertJsonMissingPath($path);

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

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

Ви можете стверджувати, що він не містить властивість email об'єкта user:

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

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');

Більш загальний метод assertInvalid може бути використаний для перевірки, що відповідь має помилки валідації, повернені як JSON або що помилки були збережені у сесії.

assertJsonValidationErrorFor

Переконайтеся, що відповідь має будь-які помилки валідації JSON для заданого ключа:

$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');

assertMethodNotAllowed

Переконайтеся, що відповідь має статусний код HTTP "метод не дозволено" (405):

$response->assertMethodNotAllowed();

assertMovedPermanently

Переконайтеся, що відповідь має статусний код HTTP "переміщено назавжди" (301):

$response->assertMovedPermanently();

assertLocation

Переконайтеся, що відповідь має вказане значення URI в заголовку Location:

$response->assertLocation($uri);

assertContent

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

$response->assertContent($value);

assertNoContent

Переконайтеся, що відповідь має вказаний HTTP статус-код і не містить контенту:

$response->assertNoContent($status = 204);

assertStreamed

Переконайтеся, що відповідь була потоковою відповіддю:

$response->assertStreamed();

assertStreamedContent

Переконайтеся, що заданий рядок відповідає вмісту потокової відповіді:

$response->assertStreamedContent($value);

assertNotFound

Переконайтеся, що відповідь має статусний код HTTP "не знайдено" (404):

$response->assertNotFound();

assertOk

Переконайтеся, що відповідь має статусний код HTTP 200:

$response->assertOk();

assertPaymentRequired

Переконайтеся, що відповідь має статусний код HTTP "потрібна оплата" (402):

$response->assertPaymentRequired();

Переконайтеся, що відповідь містить вказане незашифроване cookie:

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

assertRedirect

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

$response->assertRedirect($uri = null);

assertRedirectBack

Перевірте, чи перенаправляє відповідь назад на попередню сторінку:

$response->assertRedirectBack();

assertRedirectBackWithErrors

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

$response->assertRedirectBackWithErrors(
    array $keys = [], $format = null, $errorBag = 'default'
);

assertRedirectBackWithoutErrors

Перевірте, чи відповідь перенаправляє назад на попередню сторінку, і чи сесія не містить жодних повідомлень про помилки:

$response->assertRedirectBackWithoutErrors();

assertRedirectContains

Перевірте, чи перенаправляє відповідь на URI, що містить заданий рядок:

$response->assertRedirectContains($string);

assertRedirectToRoute

Переконайтеся, що відповідь є перенаправленням на вказаний іменований маршрут:

$response->assertRedirectToRoute($name, $parameters = []);

assertRedirectToSignedRoute

Переконайтеся, що відповідь є перенаправленням на вказаний підписаний маршрут:

$response->assertRedirectToSignedRoute($name = null, $parameters = []);

assertRequestTimeout

Переконайтеся, що відповідь має код статусу HTTP "час очікування запиту" (408):

$response->assertRequestTimeout();

assertSee

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

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

assertSeeInOrder

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

$response->assertSeeInOrder(array $values, $escape = true);

assertSeeText

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

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

assertSeeTextInOrder

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

$response->assertSeeTextInOrder(array $values, $escape = true);

assertServerError

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

$response->assertServerError();

assertServiceUnavailable

Переконайтеся, що відповідь має HTTP статус-код "Сервіс недоступний" (503):

$response->assertServiceUnavailable();

assertSessionHas

Переконайтеся, що сесія містить вказаний фрагмент даних:

$response->assertSessionHas($key, $value = null);

Якщо потрібно, замикання може бути надане як другий аргумент методу assertSessionHas. Перевірка буде успішною, якщо замикання поверне true:

$response->assertSessionHas($key, function (User $value) {
    return $value->name === 'Taylor Otwell';
});

assertSessionHasInput

Переконайтеся, що сесія має задане значення в масиві переданих даних:

$response->assertSessionHasInput($key, $value = null);

Якщо потрібно, замикання може бути надане як другий аргумент методу assertSessionHasInput. Перевірка буде успішною, якщо замикання поверне true:

use Illuminate\Support\Facades\Crypt;
 
$response->assertSessionHasInput($key, function (string $value) {
    return Crypt::decryptString($value) === 'secret';
});

assertSessionHasAll

Переконайтеся, що сесія містить заданий масив пар ключ/значення:

$response->assertSessionHasAll(array $data);

Наприклад, якщо сесія вашого застосунку містить ключі name і status, ви можете перевірити, що обидва існують і мають вказані значення наступним чином:

$response->assertSessionHasAll([
    'name' => 'Taylor Otwell',
    'status' => 'active',
]);

assertSessionHasErrors

Переконайтеся, що сесія містить помилку для заданих $keys. Якщо $keys є асоціативним масивом, переконайтеся, що сесія містить конкретне повідомлення про помилку (значення) для кожного поля (ключа). Цей метод слід використовувати при тестуванні маршрутів, які передають помилки валідації до сесії, замість того, щоб повертати їх у вигляді JSON-структури:

$response->assertSessionHasErrors(
    array $keys = [], $format = null, $errorBag = 'default'
);

Наприклад, щоб перевірити, що поля name та email мають повідомлення про помилки валідації, які були збережені в сесії, ви можете викликати метод assertSessionHasErrors таким чином:

$response->assertSessionHasErrors(['name', 'email']);

Або ви можете стверджувати, що певне поле має конкретне повідомлення про помилку валідації:

$response->assertSessionHasErrors([
    'name' => 'The given name was invalid.'
]);

Більш загальний метод assertInvalid може бути використаний для перевірки, що відповідь має помилки валідації, повернені як JSON або що помилки були збережені у сесії.

assertSessionHasErrorsIn

Переконайтеся, що сесія містить помилку для заданих $keys у конкретному мішку помилок. Якщо $keys є асоціативним масивом, переконайтеся, що сесія містить конкретне повідомлення про помилку (значення) для кожного поля (ключа) у мішку помилок:

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSessionHasNoErrors

Переконайтеся, що в сесії немає помилок валідації:

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

Переконайтеся, що сесія не має помилок валідації для заданих ключів:

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

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

assertSessionMissing

Переконайтеся, що сесія не містить вказаного ключа:

$response->assertSessionMissing($key);

assertStatus

Переконайтеся, що відповідь має заданий HTTP статус-код:

$response->assertStatus($code);

assertSuccessful

$response->assertSuccessful();

assertTooManyRequests

Переконайтеся, що відповідь має статусний код HTTP "занадто багато запитів" (429):

$response->assertTooManyRequests();

assertUnauthorized

Переконайтеся, що відповідь має статусний код HTTP "неавторизовано" (401):

$response->assertUnauthorized();

assertUnprocessable

Переконайтеся, що відповідь має статусний код HTTP "необроблювана сутність" (422):

$response->assertUnprocessable();

assertUnsupportedMediaType

Переконайтеся, що відповідь має код статусу HTTP "Unsupported Media Type" (415):

$response->assertUnsupportedMediaType();

assertValid

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

// Ствердження, що немає помилок валідації...
$response->assertValid();
 
// Ствердження, що для вказаних ключів немає помилок валідації...
$response->assertValid(['name', 'email']);

assertInvalid

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

$response->assertInvalid(['name', 'email']);

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

$response->assertInvalid([
    'name' => 'Поле ім’я є обов’язковим.',
    'email' => 'коректна електронна адреса',
]);

Якщо ви хочете перевірити, що вказані поля є єдиними полями з помилками валідації, ви можете використовувати метод assertOnlyInvalid:

$response->assertOnlyInvalid(['name', 'email']);

assertViewHas

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

$response->assertViewHas($key, $value = null);

Передача замикання як другого аргументу методу assertViewHas дозволить вам перевірити та зробити твердження щодо конкретного елемента даних представлення:

$response->assertViewHas('user', function (User $user) {
    return $user->name === 'Taylor';
});

Крім того, дані представлення можуть бути доступні як змінні масиву у відповіді, що дозволяє зручно їх перевіряти:

expect($response['name'])->toBe('Taylor');
$this->assertEquals('Taylor', $response['name']);

assertViewHasAll

Переконайтеся, що представлення відповіді має заданий список даних:

$response->assertViewHasAll(array $data);

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

$response->assertViewHasAll([
    'name',
    'email',
]);

Або ви можете стверджувати, що дані представлення присутні і мають конкретні значення:

$response->assertViewHasAll([
    'name' => 'Taylor Otwell',
    'email' => 'example@example.com,',
]);

assertViewIs

Переконайтеся, що дане представлення було повернено маршрутом:

$response->assertViewIs($value);

assertViewMissing

Переконайтеся, що даний ключ даних не був доступний у представленні, поверненому у відповіді застосунку:

$response->assertViewMissing($key);

Ствердження автентифікації

Laravel також надає різноманітні твердження, пов'язані з автентифікацією, які ви можете використовувати у функціональних тестах вашого застосунку. Зверніть увагу, що ці методи викликаються на самому класі тесту, а не на екземплярі Illuminate\Testing\TestResponse, що повертається методами, такими як get та post.

assertAuthenticated

Переконайтеся, що користувач автентифікований:

$this->assertAuthenticated($guard = null);

assertGuest

Переконайтеся, що користувач не автентифікований:

$this->assertGuest($guard = null);

assertAuthenticatedAs

Переконайтеся, що конкретний користувач автентифікований:

$this->assertAuthenticatedAs($user, $guard = null);

Перевірка Тверджень

Laravel надає два основні твердження, пов'язані з валідацією, які ви можете використовувати, щоб переконатися, що дані, надані у вашому запиті, були або дійсними, або недійсними.

assertValid

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

// Ствердження, що немає помилок валідації...
$response->assertValid();
 
// Ствердження, що для вказаних ключів немає помилок валідації...
$response->assertValid(['name', 'email']);

assertInvalid

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

$response->assertInvalid(['name', 'email']);

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

$response->assertInvalid([
    'name' => 'Поле ім’я є обов’язковим.',
    'email' => 'коректна електронна адреса',
]);