首页 > 解决方案 > 如何在不应用正文的情况下仅在存根处使用匹配器?

问题描述

我对 body 和 bodyMatchers 部分的行为感到困惑。

例如对于合同响应。
我希望我的消费者(存根)有一个来自文件的正文(来自存根的确切响应),而生产者只有一些响应匹配器(以验证响应)。

我试过的1个案例:

...
body (
    file('__files/someFile.json')
)
bodyMathers {
    jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}

预期结果:

  1. 测试有响应的匹配器 - 错误
  2. 测试没有身体匹配 - 错误
  3. 存根具有来自文件的响应正文 - 真
  4. 存根没有匹配器 - 真的

我的 json 正文和响应部分的解决方法:为生产者正文
添加一些内容,否则我不会在测试响应中获得匹配器:

body (
    $(
        consumer(
             file('__files/someFile.json')
        ),
        producer(
            cards: [
                  cardType: anyNonEmptyString()
             ]
        )
    )
)
bodyMathers {
    jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}

不久我看到的问题 - bodyMatchers 需要 body,但它不直观。
响应可能只有生产者(测试)的匹配器,请求可能只有消费者(存根)的匹配器。

我认为它应该像这样工作:

body (
    $(
       consumer(
          file('__files/someFile.json')
       )
     )
)
bodyMathers {
    jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}

更新

request {
body(
               file('__files/offer13-request.xml').asString()
       )
       bodyMatchers {
               xPath('/a/b/c/text()', byRegex('123'))
       }
}

我在存根上看到:

{
      "matchesXPath" : {
        "expression" : "/soap:Envelope/@xmlns:soap",
        "equalTo" : "http://schemas.xmlsoap.org/soap/envelope/"
      }
    }, {
      "matchesXPath" : {
        "expression" : "/a/b/c/text()",
        "matches" : "123"
      }
    }

但我只需要我的匹配器"expression" : "/a/b/c/text()"

标签: spring-cloud-contract

解决方案


我希望我的消费者(存根)有一个来自文件的主体(来自存根的确切响应),而生产者只有一些响应匹配器(以验证响应)。

这不是它的工作原理。

body (
    file('__files/someFile.json')
)
bodyMathers {
    jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}

意思是

1)你在一个文件中有一个正文someFile.json

2) 将对其进行解析,并按照 json 文件中的描述分析正文的每个部分

3) 对于具体的 json 路径,将进行正则表达式验证(仅适用于该 json 路径)

不久我看到的问题 - bodyMatchers 需要身体,但它不直观。

因为它是一个bodyMatcher它需要一个身体。这有点道理,因为它是一个身体匹配器。如果它是标题的匹配器,它将需要标题。


推荐阅读