spring-cloud-contract - 如何在不应用正文的情况下仅在存根处使用匹配器?
问题描述
我对 body 和 bodyMatchers 部分的行为感到困惑。
例如对于合同响应。
我希望我的消费者(存根)有一个来自文件的正文(来自存根的确切响应),而生产者只有一些响应匹配器(以验证响应)。
我试过的1个案例:
...
body (
file('__files/someFile.json')
)
bodyMathers {
jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}
预期结果:
- 测试有响应的匹配器 - 错误
- 测试没有身体匹配 - 错误
- 存根具有来自文件的响应正文 - 真
- 存根没有匹配器 - 真的
我的 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()"
解决方案
我希望我的消费者(存根)有一个来自文件的主体(来自存根的确切响应),而生产者只有一些响应匹配器(以验证响应)。
这不是它的工作原理。
body (
file('__files/someFile.json')
)
bodyMathers {
jsonPath('$.[cards[0]].cardType', byRegex('[A-Z]{2}')
}
意思是
1)你在一个文件中有一个正文someFile.json
2) 将对其进行解析,并按照 json 文件中的描述分析正文的每个部分
3) 对于具体的 json 路径,将进行正则表达式验证(仅适用于该 json 路径)
不久我看到的问题 - bodyMatchers 需要身体,但它不直观。
因为它是一个bodyMatcher
它需要一个身体。这有点道理,因为它是一个身体匹配器。如果它是标题的匹配器,它将需要标题。
推荐阅读
- forms - 默认选中单选按钮(未映射的 ChoiceType 字段)
- web-services - 修改底层 Web 服务签名后如何回收 ColdFusion Web 服务
- agile - SCRUM - 敏捷开发 - 一名开发人员同时处理多个用户故事
- mysql - 主键创建失败后查找重复行
- laravel - 上传图片问题
- google-cloud-platform - 我可以从同一个 windows 2012 服务器同时使用多个 gcloud 帐户吗?
- mysql - RDS InnoDB RAM 使用问题
- python - AttributeError:“‘numpy.ndarray’对象没有属性‘plot’。”
- google-sheets - 使用 Query & Importrange 在 2 个日期和 if 条件之间过滤以根据条件更改日期的值
- c# - 无法使用 System.Net.Mail 类使用内部电子邮件服务器发送邮件