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