Утверждение структуры JSON ответа в Laravel

Источник: «Asserting a JSON Response Structure in Laravel»
Узнайте, как можно проверить структуру JSON ответов в Laravel с помощью мощных методов утверждения JSON, доступных в классе TestResponse в Laravel.

При написании тестов для ответов API в Laravel может быть целесообразно проверять структуру ответа. В Laravel есть метод assertJson(), который можно использовать для проверки значений JSON в заданном тестовом ответе:

it('Returns Arizona sports teams', function () {
$this->get('api/teams/arizona')
->assertJson(function (AssertableJson $json) {
$json->has('teams', 3);
$json->has('teams.0', function (AssertableJson $json) {
$json
->where('name', 'Phoenix Suns')
->etc();
});
});
});

Учитывая приведённый тест, вот статический пример JSON данных:

{
"teams": [
{
"name": "Phoenix Suns",
"sport": "Basketball"
},
{
"name": "Arizona Cardinals",
"sport": "Football"
},
{
"name": "Arizona Diamondbacks",
"sport": "Baseball"
}
]
}

Тест проверяет, что в списке три команды из Аризоны и что свойство name существует в первой записи. Это отлично подходит для валидации фактических значений выборки ответа с помощью мощных JSON API утверждений в Laravel. В дополнение к этим утверждениям возможна проверка общей структуры всего ответа:

$response->assertJsonStructure([
'teams' => [
'*' => ['name', 'sport'],
],
]);

Одно предостережение для утверждения assertJsonStucture(): если в будущем будет добавлен новый ключ, этот тест по-прежнему будет успешным. Если необходима большая точность, то лучше обратиться к assertExactJson(). Если требуется просто обобщить структуру JSON, чтобы убедиться в наличии определённых свойств в ответе, assertJsonStructure() даст возможность убедиться, что вся структура содержит ожидаемые свойства.

Если нужны более подробные утверждения относительно структуры JSON, можно обратиться к утверждениям whereType() и whereAllType(). Учитывая предыдущий пример, проверку типов в ответах JSON можно выполнить следующим образом:

$response->assertJson(function (AssertableJson $json) {
$json->has('teams', 3);
$json->has('teams.0', function (AssertableJson $json) {
$json->whereAllType([
'name' => 'string',
'sport' => 'string',
]);
});
});

Использование whereAllType требует определения типов для каждого ключа в элементе teams, если только не используется вышеуказанный вариант с ->etc():

$json->whereAllType([
'name' => 'string',
// 'sport' => 'string',
])->etc();

Как уже упоминалось, приведённый выше код не утверждает весь ответ и предполагает, что другие команды имеют такую же структуру. Можно утверждать каждую команду в массиве и даже использовать данные Eloquent фабрики для проверки соответствия значений ответа. Как правило, комбинация вышеуказанных утверждений обеспечивает ожидаемую форму JSON ответа, и можно добавлять более сложные утверждения, если это необходимо. Дополнительные примеры и полезные утверждения JSON можно найти в документации Laravel.

Дополнительные материалы

Предыдущая Статья

Создание виртуального столбца в базе данных в Laravel

Следующая Статья

Что делает aria-hidden=true с интерактивными элементами на самом деле