我得到的响应是一个JsonObject(不是JsonArray),它可以具有一组动态的 key.value 对。我不提前知道对于任何给定请求 key.values 对的特定集合。
我对“所有可能的”键。值对有一定的了解。是否有可能测试(匹配)给定响应中的key.value对是否“包含”在可能的key.value对的“超集”中?
这是一个基本概念:
* def response = {"number": "1234567890", "name": "a_name"}
* def super_set = {"location": "#string", "number": "#number", "depart": "#string", "name": "#string"}
* match response contains super_set
如果{{1}中的两个键都包含在match
中并且每个键都匹配,则true
将是response
。 >模糊匹配标记。
我已经阅读了有关super_set
,contains
,contains any
等的文档,但看来它们仅适用于数组。
我实际上认为我需要的是反逻辑:
contains only
但是我不确定如何完成它。
答案 0 :(得分:1)
通过调用Java来解决此问题,传递实际响应和超集,并在实际响应中返回映射匹配键,但具有超集中的值(模糊匹配标记)。
答案 1 :(得分:0)
没有Java:
* def response = {"number": "1234567890", "name": "a_name"}
* def super_set = {"location": "#string", "number": "#number", "depart": "#string", "name": "#string"}
* def expected = {}
* eval karate.forEach(response, function(k){ if (super_set[k]) expected[k] = super_set[k] })
* match response == expected
编辑:使用新的karate.filterKeys()
API(版本从0.9.4开始)会更容易
* def schema = { a: '#string', b: '#number', c: '#boolean' }
* def response = { a: 'x', c: true }
# very useful for validating a response against a schema "super-set"
* match response == karate.filterKeys(schema, response)
* match karate.filterKeys(response, 'b', 'c') == { c: true }
* match karate.filterKeys(response, ['a', 'b']) == { a: 'x' }