Laravel HTTP 测试使用 getJson + assertJsonStructure 对象数组

Posted

技术标签:

【中文标题】Laravel HTTP 测试使用 getJson + assertJsonStructure 对象数组【英文标题】:Laravel HTTP Test using getJson + assertJsonStructure array of objects 【发布时间】:2021-04-06 07:42:21 【问题描述】:

我有一个 Laravel 8 应用程序,我想在其中测试从 HTTP API 调用返回的 JSON 的一部分。我的响应对象如下所示:


    "data": [
        
            "name": "Cumque ex quos.",
            "createdAt": "2020-12-29T17:15:32.000000Z",
            "updatedAt": "2020-12-29T17:15:32.000000Z",
            "startAt": "2021-01-18 17:15:32",
            "endAt": "2021-01-18 17:15:32",
            "startedAt": null,
            "status": "Running",
            "range": 
                "type": "percentage",
                "max": 0,
                "min": 0
            ,
        ,
        
            "name": "Cumque ex quos 2.",
            "createdAt": "2020-12-29T17:15:32.000000Z",
            "updatedAt": "2020-12-29T17:15:32.000000Z",
            "startAt": "2021-01-18 17:15:32",
            "endAt": "2021-01-18 17:15:32",
            "startedAt": null,
            "status": "Pending",
            "range": 
                "type": "percentage",
                "max": 20,
                "min": 100
            ,
        ,
    ],
    "other_keys" [ ... ];

我有兴趣测试data 键返回的数组的结构。这是我正在使用的测试失败:

 /** @test */
    public function should_get_data_and_validate_the_structure()
    
        $this->withoutExceptionHandling();

        $response = $this->getJson('/api/v1/data');

        $response->assertJsonStructure([
            'data' => [
                'createdAt',
                'endAt',
                'name',
                'startAt',
                'startedAt',
                'status',
                'updatedAt',
                'range' => [
                    'max',
                    'min',
                    'type'
                ],           
            ]
        ]);
    

测试失败并出现以下错误:Failed asserting that an array has the key 'createdAt'.

【问题讨论】:

【参考方案1】:

data 是一个array,因此,要断言嵌套对象的结构,我们需要使用* 通配符:

$response->assertJsonStructure([
   'data' => [
         '*' => [
            'createdAt',
            'endAt',
            'name',
            'startAt',
            'startedAt',
            'status',
            'updatedAt',
            'range' => [
                'max',
                'min',
                'type'
            ],
        ]
      ]
]);

【讨论】:

这行得通——你能指出我在文档中讨论通配符的位置吗? 乐于助人!不确定它是否记录在案,但我已经直接检查了source code

以上是关于Laravel HTTP 测试使用 getJson + assertJsonStructure 对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?

Laravel 8 测试 GET http 请求误报

如何在 Laravel 中测试 Http Pool?

jQuery $.getJSON() 失败

Laravel 8 上的 HTTP RESTful API 功能测试

getJSON 错误 - 不知道哪里出错了