Как пройти через массив ответов каратэ и передать его по пути json ответа другого веб-сервиса - PullRequest
0 голосов
/ 25 августа 2018

Я использую каратэ версии 0.8.0.1 и хочу выполнить следующие шаги для проверки некоторых ответов.

  1. Я делаю Get to web service 1
  2. найдите значение для валют из ответа веб-службы 1, используя jsonpath: $ .currencies
  3. Шаг 2 дает мне следующий результат: ["USD", "HKD", "SGD", "INR", "GBP"]
  4. Теперь я использую метод Get для веб-сервиса 2
  5. Из ответа веб-службы 2 я хочу получить значение поля цены с помощью json-path, как показано ниже (передавая значения из шага 3 выше):

    • $. Холдинговая [? (@. Валюте == 'USD')]. Цена
    • $. Холдинговая [? (@. Валюта == 'HKD')]. Цена
    • $. Холдинговая [? (@. Валюты == 'SGD')]. Цена
    • $. Холдинговая [? (@. Валюта == 'INR')]. Цена
    • $. Холдинговая [? (@. Валюты == 'GBP')]. Цена

Итак, валют так много, но я хочу проверить цену только для валют, возвращаемых веб-службой 1 (которая всегда будет случайной), и передать ее на выход веб-службы 2, чтобы получить цену. Как только я получу цену, я сопоставлю каждое значение цены со значением, возвращенным из БД.

Я не уверен, есть ли какой-нибудь простой способ, которым я могу передать значения, возвращенные службой 1, в json-путь службы 2 по одному и получить требуемые результаты. Любые предложения для этого будут полезны, так как это будет иметь место для большинства веб-сервисов, которые я буду автоматизировать.

1 Ответ

0 голосов
/ 25 августа 2018

Есть несколько способов сделать это в каратэ.Ниже следует дать вам несколько советов.Обратите внимание, как существует волшебная переменная _$ при использовании match each.И поскольку вы можете ссылаться на любой другой JSON в области видимости, у вас есть несколько очень мощных опций.

* def expected = { HKD: 1, INR: 2, USD: 3}
* def response1 = ['USD', 'HKD', 'INR']
* def response2 = [{ currency: 'INR', price: 2 }, { currency: 'USD', price: 3 }, { currency: 'HKD', price: 1 }]
* match response2[*].currency contains only response1
* match each response2 contains { price: '#(expected[_$.currency])' }

Вы, наверное, уже видели, как вы можете call второй файл объектов в цикле которые могут понадобиться для вашего конкретного случая использования.Еще одна часть головоломки может заключаться в следующем - очень легко преобразовать любой массив JSON в форму, ожидаемую Карате для вызова файла объектов в цикле:

* def response = ['USD', 'HKD', 'INR']
* def data = karate.map(response, function(x){ return { code: x } })
* match data == [{code: 'USD'}, {code: 'HKD'}, {code: 'INR'}]
...