Тестування 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
{
/**
* A basic test example.
*/
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
{
/**
* A basic test example.
*/
public function test_a_basic_request(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Загалом кожен ваш тест має робити лише один запит до застосунку. Якщо в межах одного тестового методу виконується кілька запитів, поведінка може бути несподіваною.
Для зручності під час прогону тестів
middlewareCSRF автоматично вимикається.
Налаштування заголовків запиту
Метод 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
{
/**
* A basic functional test example.
*/
public function test_interacting_with_headers(): void
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
$response->assertStatus(201);
}
}
Cookie
Методи 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('/');
//
}
}
Ви також можете вказати, який гард слід використати для автентифікації заданого користувача, передавши ім'я гарда другим аргументом до методу actingAs. Переданий методу actingAs гард стане також гардом за замовчуванням на час тесту:
$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
{
/**
* A basic test example.
*/
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
{
/**
* A basic test example.
*/
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');
// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);
// Assert against the exception...
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
{
/**
* A basic test example.
*/
public function test_exception_is_thrown(): void
{
Exceptions::fake();
$response = $this->get('/');
// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);
// Assert against the exception...
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
{
/**
* A basic functional test example.
*/
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-відповіді. Якщо ви хочете переконатися, що заданий масив точно збігається з 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
{
/**
* A basic functional test example.
*/
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
{
/**
* A basic functional test example.
*/
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;
/**
* A basic functional test example.
*/
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 також дозволяє відрендерити представлення, не виконуючи симульованого 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. Метод component повертає екземпляр 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;
/**
* A basic functional test example.
*/
public function test_basic_example(): void
{
$response = $this->get(action([UserController::class, 'index']));
// ...
}
}
Доступні твердження
Твердження щодо відповіді
Клас Illuminate\Testing\TestResponse у Laravel надає різні власні методи тверджень, якими ви можете скористатися під час тестування свого застосунку. Ці твердження доступні на відповіді, яку повертають тестові методи 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();
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.
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');
Загальніший метод assertInvalid дозволяє перевірити, що у відповіді є помилки валідації, повернені як JSON, або що помилки було передано до сховища сесії.
assertJsonValidationErrorFor
Перевіряє, що відповідь має будь-які помилки валідації JSON для заданого ключа:
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
assertMethodNotAllowed
Перевіряє, що відповідь має код статусу HTTP «method not allowed» (405):
$response->assertMethodNotAllowed();
assertMovedPermanently
Перевіряє, що відповідь має код статусу HTTP «moved permanently» (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 «not found» (404):
$response->assertNotFound();
assertOk
Перевіряє, що відповідь має код статусу HTTP 200:
$response->assertOk();
assertPaymentRequired
Перевіряє, що відповідь має код статусу HTTP «payment required» (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 «request timeout» (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 «Service Unavailable» (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);
assertSessionMissingInput
Перевіряє, що в сесії немає заданого ключа в масиві переданих даних форми:
$response->assertSessionMissingInput($key);
assertStatus
Перевіряє, що відповідь має заданий код статусу HTTP:
$response->assertStatus($code);
assertSuccessful
Перевіряє, що відповідь має успішний код статусу HTTP (>= 200 і < 300):
$response->assertSuccessful();
assertTooManyRequests
Перевіряє, що відповідь має код статусу HTTP «too many requests» (429):
$response->assertTooManyRequests();
assertUnauthorized
Перевіряє, що відповідь має код статусу HTTP «unauthorized» (401):
$response->assertUnauthorized();
assertUnprocessable
Перевіряє, що відповідь має код статусу HTTP «unprocessable entity» (422):
$response->assertUnprocessable();
assertUnsupportedMediaType
Перевіряє, що відповідь має код статусу HTTP «unsupported media type» (415):
$response->assertUnsupportedMediaType();
assertValid
Перевіряє, що у відповіді немає помилок валідації для заданих ключів. Цей метод можна використовувати для перевірки відповідей, у яких помилки валідації повертаються структурою JSON або передаються до сесії:
// Assert that no validation errors are present...
$response->assertValid();
// Assert that the given keys do not have validation errors...
$response->assertValid(['name', 'email']);
assertInvalid
Перевіряє, що у відповіді є помилки валідації для заданих ключів. Цей метод можна використовувати для перевірки відповідей, у яких помилки валідації повертаються структурою JSON або передаються до сесії:
$response->assertInvalid(['name', 'email']);
Ви також можете перевірити, що заданий ключ має конкретне повідомлення про помилку валідації. При цьому ви можете передати повне повідомлення або лише невелику його частину:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);
Якщо ви хочете перевірити, що задані поля - єдині з помилками валідації, скористайтеся методом 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' => 'taylor@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 або передаються до сесії:
// Assert that no validation errors are present...
$response->assertValid();
// Assert that the given keys do not have validation errors...
$response->assertValid(['name', 'email']);
assertInvalid
Перевіряє, що у відповіді є помилки валідації для заданих ключів. Цей метод можна використовувати для перевірки відповідей, у яких помилки валідації повертаються структурою JSON або передаються до сесії:
$response->assertInvalid(['name', 'email']);
Ви також можете перевірити, що заданий ключ має конкретне повідомлення про помилку валідації. При цьому ви можете передати повне повідомлення або лише невелику його частину:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);