Утверждение структуры JSON ответа в Laravel
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.