Есть ли «содержащий» подобный эквивалент для JsonObject (не только для JsonArray)? - PullRequest
1 голос
/ 20 июня 2019

Я получаю ответ, который представляет собой JsonObject (не JsonArray), который может иметь динамический набор пар key.value .Я не знаю заранее, какой будет конкретная коллекция пар key.values ​​ для любого данного запроса.

У меня есть достаточные знания о "всех возможных" парах key.value.Можно ли проверить (сопоставить), что пары 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

match будет true, если оба ключа в response содержат в super_set, и каждый ключ соответствует нечеткому совпадению маркер.

Я прочитал документы, касающиеся contains, contains any, contains only и т. Д., Но, похоже, они подходят только для массивов.

Что мне действительно нужно, так этообратная логика:

* match super_set contains response

но я просто не знаю, как это сделать.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Решено это путем вызова Java, передачи фактического ответа и супер-набора и возврата ключей соответствия карты в фактическом ответе, но со значениями (маркерами нечеткого совпадения) из супер-набора.

0 голосов
/ 21 июня 2019

без 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' }
...