与具有嵌套数组的请求正文的合同
Contract with request body having a nested array
我有这份合同
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
| }
| ]
| }
|
-----------------------------------------------------------------------------------------------------------------------
如何使用具有嵌套数组的请求主体处理这种情况?
生成的 jsonpath 会搜索与正则表达式匹配的任何元素。这意味着至少有一个。如果您需要它们全部匹配,您可以通过 spring.cloud.contract.verifier.assert.size 属性 使用数组大小检查。您可以在下面的文档中找到有关此内容的条目
验证 JSON 数组大小的支持是实验性的。如果要打开它,请将以下系统属性的值设置为true:spring.cloud.contract.verifier.assert.size。默认情况下,此功能设置为 false。您还可以在插件配置中设置 assertJsonSize 属性。
我有这份合同
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
| }
| ]
| }
|
-----------------------------------------------------------------------------------------------------------------------
如何使用具有嵌套数组的请求主体处理这种情况?
生成的 jsonpath 会搜索与正则表达式匹配的任何元素。这意味着至少有一个。如果您需要它们全部匹配,您可以通过 spring.cloud.contract.verifier.assert.size 属性 使用数组大小检查。您可以在下面的文档中找到有关此内容的条目
验证 JSON 数组大小的支持是实验性的。如果要打开它,请将以下系统属性的值设置为true:spring.cloud.contract.verifier.assert.size。默认情况下,此功能设置为 false。您还可以在插件配置中设置 assertJsonSize 属性。