在PhpUnit测试中匹配JsonStructure - Laravel 5.4

Far*_*han 22 phpunit unit-testing laravel laravel-5 laravel-5.4

我正在创建一个单元测试,并希望测试JSON响应中返回的结构.我知道它TestResponse提供了一种assertJsonStructure匹配JSON响应结构的方法.但由于某种原因,我无法将其映射$structure到我的响应,结果测试失败.让我分享一下所需的片段.

终点响应

{
   "status": true,
   "message": "",
   "data": [
       {
          "id": 2,
          "name": "Shanelle Goodwin",
          "email": "chaz43@example.net",
          "created_at": "2017-03-05 16:12:49",
          "updated_at": "2017-03-05 16:12:49",
          "user_id": 1
       }
    ]
}
Run Code Online (Sandbox Code Playgroud)

测试功能

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");
}
Run Code Online (Sandbox Code Playgroud)

data数组中可以有多个节点,这就是为什么我试图在结构中提到数组,但似乎它没有正确映射.任何帮助将不胜感激:-)

Far*_*han 53

幸运的是,玩了不同的选择我已经解决了这个问题.如果我们要匹配数组中的嵌套对象,则期望'*'作为键.我们可以在这里看到参考.

来源:TestResponse - 第363行

我为array of对象设置了这样的结构

$response->assertJsonStructure([
    'status',
    'message',
    'data' => [
      '*' => [
        'id',
        'name',
        'email',
        'created_at',
        'updated_at',
        'user_id'
      ]
    ]
  ]);
Run Code Online (Sandbox Code Playgroud)

如果你想只匹配一个对象

$response->assertJsonStructure([
    'status',
    'message',
    'data' => [
      [
        'id',
        'name',
        'email',
        'created_at',
        'updated_at',
        'user_id'
      ]
    ]
  ]);
Run Code Online (Sandbox Code Playgroud)

  • 非常有用!应该在官方文档中。感谢您为我们钓鱼。 (3认同)