我有以下YAML合同:
request:
method: GET
url: /get
response:
status: 200
body:
name: 'Name'
code: '123'
asOfDate: '1994-05-25T04:00:00.000Z'
matchers:
body:
- path: "$[*].name"
type: by_type
- path: "$[*].code"
type: by_regex
value: '[0-9]{3}'
- path: "$[*].asOfDate"
type: by_regex
predefined: iso_date_time
生成以下测试代码:
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("['code']").isEqualTo("123");
assertThatJson(parsedJson).field("['asOfDate']").isEqualTo("1994-05-25T04:00:00.000Z");
assertThatJson(parsedJson).field("['name']").isEqualTo("Name");
// and:
assertThat((Object) parsedJson.read("$[*].name")).isInstanceOf(java.util.List.class);
assertThat((java.lang.Iterable) parsedJson.read("$[*].code", java.util.Collection.class)).allElementsMatch("[0-9]{3}");
assertThat((java.lang.Iterable) parsedJson.read("$[*].asOfDate", java.util.Collection.class)).allElementsMatch("ignore");
我的问题是我不希望合同强制代码完全匹配值(前三个断言)。我只希望合同生成最后三个断言(检查正确输入的断言)。
我在YAML合同中有没有正确写的东西?值得注意的是,删除" asOfDate"从响应主体生成我想要的断言,但如果我删除" name"和"代码",根本不会生成断言。
答案 0 :(得分:0)
我认为你的道路是错的。您应该写$.name
,$.code
和$.asOfDate
。然后SC-Contract将从自动生成中删除这些条目。
答案 1 :(得分:0)
如果您只想使用response-> matchers-> body的检查,而又不想使用response-> body的检查,则可以采取Marcin建议的技巧:
request:
method: GET
url: /get
response:
status: 200
body:
name: $.name
code: $.code
asOfDate: $.asOfDate
matchers:
body:
- path: "$[*].name"
type: by_type
- path: "$[*].code"
type: by_regex
value: '[0-9]{3}'
- path: "$[*].asOfDate"
type: by_regex
predefined: iso_date_time
因此,您将没有断言,例如:
assertThatJson(parsedJson).field("['name']").isEqualTo("Name");
但仅:
assertThat(parsedJson.read("$[*].code", String.class)).matches("[0-9]{3}");