Матч JsonStructure в тесте PhpUnit - Laravel 5.4
Я создаю unit test и хочу протестировать структуру JSON
, возвращенную в ответе. Я знаю, что TestResponse
предоставляет метод assertJsonStructure
для соответствия структуре вашего ответа JSON
. Но по какой-то причине я не могу сопоставить $structure
с моим ответом, и в результате тест завершился неудачно. Позвольте мне поделиться необходимыми фрагментами.
Ответ на конечную точку
{
"status": true,
"message": "",
"data": [
{
"id": 2,
"name": "Shanelle Goodwin",
"email": "[email protected]",
"created_at": "2017-03-05 16:12:49",
"updated_at": "2017-03-05 16:12:49",
"user_id": 1
}
]
}
Функция тестирования
public function testEndpoint(){
$response = $this->get('/api/manufacturer/read', [], $this->headers);
$response->assertStatus(200);
$response->assertJsonStructure([
'status',
'message',
'data' => [
{
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
}
]
]);
var_dump("'/api/manufacturer/read' => Test Endpoint");
}
В массиве data
может быть несколько узлов, поэтому я попытался упомянуть массив в структуре, но кажется, что он неверно отображен. Любая помощь будет оценена: -)
Ответы
Ответ 1
К счастью, играя с разными вариантами, я решил эту проблему. A '*' ожидается как ключ, если мы хотим сопоставить вложенный объект в массиве. Мы можем видеть здесь ссылку.
Источник: TestResponse - строка # 363
Я создал такую структуру для array of
objects`
$response->assertJsonStructure([
'status',
'message',
'data' => [
'*' => [
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
]
]
]);
И если вы хотите совместить только один объект
$response->assertJsonStructure([
'status',
'message',
'data' => [
[
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
]
]
]);
Ответ 2
Я думаю, вы должны использовать:
$response->assertJsonStructure([
'status',
'message',
'data' => [
[ // change here
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
] // change here
]
]);