Тести HTTP
- Вступ
- Виконання запитів
- Тестування JSON API
- Тестування Завантаження Файлів
- Тестування представлень
- Доступні твердження
Вступ
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 assertBadRequest assertClientError assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertExactJsonStructure assertForbidden assertFound assertGone assertHeader assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath 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 assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
assertAccepted
Переконайтеся, що відповідь має прийнятий (202) HTTP статус-код:
$response->assertAccepted();
assertBadRequest
Переконайтеся, що відповідь має статусний код HTTP "поганий запит" (400):
$response->assertBadRequest();
assertClientError
Переконайтеся, що відповідь має код статусу HTTP клієнтської помилки (>= 400, < 500):
$response->assertClientError();
assertConflict
Переконайтеся, що відповідь має статусний код конфлікту (409) HTTP:
$response->assertConflict();
assertCookie
Переконайтеся, що відповідь містить вказане cookie:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
Переконайтеся, що відповідь містить вказане cookie і воно прострочене:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
Переконайтеся, що відповідь містить вказане cookie і воно не прострочене:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
Переконайтеся, що відповідь не містить вказаного 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();
assertPlainCookie
Переконайтеся, що відповідь містить вказане незашифроване 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' => 'коректна електронна адреса',
]);
