首页 > 解决方案 > Pact,确保数组中的键名

问题描述

如果返回的 json 是一个 map,那么在 body 响应中指定的所有键名都将被证明存在。所以

...
"response": 
{
    "status": 200,
    "body": 
    {
        "field1": "value1"
    }
...

将确保该正文包含一个键“field1”,如果它丢失,则会发生错误。

但是如果响应体是一个数组呢?如果该数组中的所有或至少一个元素具有特定的键名,我认为没有机会进行测试。但这很重要,如果后端中的键名发生变化,我想得到警告,因为这会在我的应用程序中产生错误。

标签: arrayspact

解决方案


您可以使用eachLike指定数组元素匹配特定格式。正确的语法取决于您使用的 Pact 框架,但使用 pact-js,您会说:

const { somethingLike: like, term, eachLike } = pact
....

willRespondWith: {
   status: 200,
   body: eachLike({
    "field1": "value1"
   })
}

这是文档的相关部分


您的示例建议您自己编写 Pact 文件 - 如果是这种情况,您可以使用该[*]符号来描述任何数组元素,如规范中所述:

"response": 
{
  "status": 200,
  "body": 
    [ 
      {
        "field1": "value1"
      }
    ],
  ...

  "matchingRules": {
     "$.body": {
       "min": 1,
       "match": "type"
     },
     "$.body[*].field1": {
        "match": "type"
     },
  ...

推荐阅读