Метод assertJsonStructure
Метод assertJsonStructure применяется к экземпляру класса
Illuminate\Testing\TestResponse, который возвращается
при выполнении HTTP-запросов в тестах. Этот метод проверяет,
соответствует ли структура JSON-ответа заданному шаблону.
Первым параметром передаётся массив ожидаемых ключей или
вложенная структура. Если проверка не проходит, тест
завершается с ошибкой.
Синтаксис
<?php
$response->assertJsonStructure($structure);
?>
Метод принимает массив $structure, где ключи -
это ожидаемые поля в JSON-ответе. Для проверки
вложенных структур используются вложенные массивы.
Пример
Предположим, у нас есть контроллер, который возвращает информацию о пользователе в формате JSON. Создадим тест для проверки структуры этого ответа:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_response_structure()
{
$user = User::factory()->create();
$res = $this->getJson("/api/users/{$user->id}");
$res->assertJsonStructure([
'id',
'name',
'email',
'created_at',
'updated_at'
]);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Проверим структуру JSON-ответа с вложенными объектами. Пусть наш API возвращает данные о пользователе и его постах:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
class UserPostsTest extends TestCase
{
public function test_user_with_posts_response()
{
$user = User::factory()->hasPosts(3)->create();
$res = $this->getJson("/api/users/{$user->id}/posts");
$res->assertJsonStructure([
'id',
'name',
'email',
'posts' => [
'*' => [
'id',
'title',
'content',
'created_at'
]
]
]);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Проверим структуру ответа с опциональными полями.
Используем синтаксис 'field?' для указания,
что поле может отсутствовать в ответе:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
class OptionalFieldsTest extends TestCase
{
public function test_response_with_optional_fields()
{
$article = Article::factory()->create([
'deleted_at' => null
]);
$res = $this->getJson("/api/articles/{$article->id}");
$res->assertJsonStructure([
'id',
'title',
'content',
'deleted_at?'
]);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Пример
Проверим структуру ответа со смешанными типами данных.
Метод assertJsonStructure также поддерживает
проверку типов с использованием специальных маркеров:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Order;
class MixedTypesTest extends TestCase
{
public function test_response_mixed_types()
{
$order = Order::factory()->create([
'total' => 100.50,
'is_paid' => true
]);
$res = $this->getJson("/api/orders/{$order->id}");
$res->assertJsonStructure([
'id' => 'integer',
'user_id' => 'integer',
'total' => 'numeric',
'is_paid' => 'boolean',
'description' => 'string|null',
'created_at' => 'string'
]);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Смотрите также
-
метод
assertJson,
который проверяет наличие фрагмента JSON в ответе -
метод
assertJsonPath,
который проверяет значение по пути в JSON -
метод
assertJsonCount,
который проверяет количество элементов в массиве JSON -
метод
assertExactJson,
который проверяет полное совпадение JSON