如何不使用主体而仅在存根使用匹配器?

时间:2019-06-06 08:30:50

标签: spring-cloud-contract

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

例如合同响应。
我希望我的使用者(存根)从文件中获得一个正文(存根中的确切响应),而生产者只为响应提供一些匹配器(以验证响应)。

我尝试了1个案例:

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

预期-结果:

  1. 测试具有响应者匹配项-false
  2. 测试没有正文匹配-假
  3. 存根具有文件的响应主体-true
  4. 存根没有匹配器-是

我对json正文和响应部分的解决方法:
为生产者正文添加某些内容,否则测试响应中没有匹配项:

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

我很快看到了一个问题- bodyMatchers需要主体,但是它不直观。
响应可能只有生产者(测试)匹配器,而请求可能只有消费者的匹配器(存根)。

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

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()"

1 个答案:

答案 0 :(得分:0)

  

我希望我的使用者(存根)从文件中得到一个正文(存根中的确切响应),而生产者只为响应提供一些匹配器(以验证响应)。

那不是它的工作方式。

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

表示

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

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

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

  

我很快看到了一个问题-bodyMatchers需要身体,但它不直观。

由于它是bodyMatcher,因此需要一个正文。因为它是身体匹配器,所以这很有意义。如果它是标头的匹配器,则需要标头。