Laravel має набір перевірок для JSON-відповідей. Головне - обирати перевірку під те, що саме гарантує API.
it('returns a vacancy', function () {
$vacancy = Vacancy::factory()->create(['title' => 'Laravel Developer', 'salary_from' => 3000]);
$this->getJson("/api/vacancies/{$vacancy->id}")
->assertOk()
->assertJsonPath('data.title', 'Laravel Developer')
->assertJsonPath('data.salary_from', 3000)
->assertJsonStructure([
'data' => ['id', 'title', 'salary_from', 'company' => ['id', 'name']],
]);
});
Основні методи:
| Метод | Що перевіряє |
|---|---|
assertJson([...]) |
відповідь містить ці дані (інші поля дозволені) |
assertExactJson([...]) |
відповідь дорівнює цьому JSON |
assertJsonPath('data.title', '...') |
значення за шляхом |
assertJsonStructure([...]) |
наявність ключів (без значень) |
assertExactJsonStructure([...]) |
ключі - і жодних зайвих |
assertJsonCount(20, 'data') |
кількість елементів |
assertJsonMissingPath('data.password') |
поля немає |
assertJsonValidationErrors(['email']) |
помилки валідації для полів |
Методи запиту: getJson, postJson, patchJson, deleteJson - автоматично додають Accept: application/json, тож помилки валідації приходять як JSON 422, а не редирект.
Що варто перевіряти в API-тестах:
- контракт: структура відповіді й типи - те, на що покладаються клієнти;
- приховані поля:
assertJsonMissingPath('data.password_hash')- захист від випадкового витоку при зміні ресурсу; - коди статусу для кожного сценарію: 201 при створенні, 422 при помилках, 403 для чужого ресурсу, 404 для неіснуючого;
- авторизацію: запит від іншого користувача (
actingAs($stranger)) - найчастіше забута перевірка; - пагінацію й фільтри:
assertJsonCount, перевірка, що фільтр справді відсікає записи.
Пастки:
assertJsonне перевіряє відсутність полів - нове випадкове поле в ресурсі тест не помітить. Для захисту контракту -assertExactJsonStructureабо перевірка відповідності специфікації OpenAPI;- типи:
assertJsonPath('data.price', 100)і'100.00'- різні значення; рішення про формат грошей має бути зафіксоване тестом; - дати порівнюють у форматі, який віддає API (ISO 8601 з поясом), а не як об'єкти Carbon.
Для складних перевірок - fluent-API assertJson(fn (AssertableJson $json) => ...).