【问题标题】:Contract with request body having a nested array与具有嵌套数组的请求主体签订合同
【发布时间】:2021-10-17 11:48:09
【问题描述】:

我有这份合同

org.springframework.cloud.contract.spec.Contract.make {
    request {
        method 'POST'
        url ('/v1/foo') {
            body([
                    fooList: [[
                        id: anyUuid()
                    ]]
            ])
        }
        headers {
            contentType applicationJson()
        }
    }
    response {
        status OK()
    }
}

当我像下面这样用 Postman 测试它时,它按预期工作

{
    "fooList": [
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b860" },
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b861" }
    ]
}

但是当我试图让它失败并像下面这样只更改一个 id 时,它也可以工作!!

{
    "fooList": [
        { "id": 1 },
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b861" }
    ]
}

当所有 id 都不正确时它失败了!!

{
    "fooList": [
        { "id": 1 },
        { "id": 1 }
    ]
}

喜欢这个

                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
POST                                                       | POST
/v1/processOdr                                             | /v1/processOdr
                                                           |
Content-Type [matches] : application/json.*                | Content-Type: application/json
                                                           |
$.['fooList'][*][?(@.['id'] =~                             | {                                                   <<<<< Body does not match
/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]  |     "fooList": [
{12}/)]                                                    |         {
                                                           |             "id": 1
                                                           |         },
                                                           |         {
                                                           |             "id": 1
                                                           |         }
                                                           |     ]
                                                           | }
                                                           |
-----------------------------------------------------------------------------------------------------------------------

如何处理带有嵌套数组的请求体?

【问题讨论】:

    标签: spring spring-cloud spring-cloud-contract


    【解决方案1】:

    生成的 jsonpath 会搜索与正则表达式匹配的任何元素。这意味着至少有一个。如果您需要所有这些都匹配,您可以通过 spring.cloud.contract.verifier.assert.size 属性使用数组大小​​检查。您可以在下面找到文档中关于此的条目

    对验证 JSON 数组大小的支持是实验性的。如果要打开它,请将以下系统属性的值设置为 true:spring.cloud.contract.verifier.assert.size。默认情况下,此功能设置为 false。您还可以在插件配置中设置 assertJsonSize 属性。

    【讨论】:

    • 验证JSON数组大小的支持是实验性的你的意思是这个功能还不稳定,可能会导致一些错误吗?
    • 是的,就是这个意思
    • 虽然它已经存在多年,但我不记得有任何关于它的问题。所以要么没有人使用它,要么它工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多