Матч 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
    ]
  ]);