是否有与JsonObject等效的“包含”(而不仅仅是JsonArray)?

时间:2019-06-20 18:58:47

标签: karate

我得到的响应是一个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_setcontainscontains any等的文档,但看来它们仅适用于数组。

我实际上认为我需要的是反逻辑:

contains only

但是我不确定如何完成它。

2 个答案:

答案 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' }