Каратэ - как получить доступ к элементу массива по UUID во время оператора «Retry To» - PullRequest
0 голосов
/ 04 марта 2020

У меня есть конечная точка, которая возвращает этот JSON ответ:

{
  "jobs": [
    {
      "name": "job1",
      "id": "d6bd9aa1-0708-436a-81fd-cf22d5042689",
      "status": "pending"
    },
    {
      "name": "job2",
      "id": "4fdaf09f-51de-4246-88fd-08d4daef6c3e",
      "status": "pending"
    }
  ]

Я хотел бы повторно ПОЛУЧИТЬ вызов этой конечной точки, пока задание, о котором я забочусь ("job2"), не получит "status" "completed", но я хотел бы проверить это, используя UUID, сохраненный в переменной из предыдущего вызова.

, то есть сделав что-то вроде этого:

#NB: code for previous API call is executed
* def uuidVar = response.jobRef
#NB: uuidVar equates to '4fdaf09f-51de-4246-88fd-08d4daef6c3e' for this scenario

* configure retry = { count: 5, interval: 10000 }

Given path /blah
And retry until response.jobs[?(@.id==uuidVar)].status == 'completed'
When method GET

Может кто-нибудь предложить правильный синтаксис для retry until?

Я пытался ссылаться на fantasti c документы и примеры по каратэ (в частности, js-arrays.feature) и некоторые вопросы по SO (включая вот это: Фреймворк для каратэ, пока не работает должным образом ), но, к сожалению, я не смог заставить это работать.

Я также попытался использовать karate.match здесь, как предложено в ссылке выше, но без сигары.

Заранее извиняюсь, если я упускаю что-то очевидное.

1 Ответ

1 голос
/ 05 марта 2020

Сначала я рекомендую вам прочитать этот ответ о переполнении стека, он на самом деле связан с файлом readme и предназначен для окончательной ссылки. Дайте мне знать, если это нужно улучшить: { ссылка }

Краткий ответ, вы не можете использовать JsonPath в выражении retry until, оно должно быть чистым JavaScript.

Хотя вы можете использовать karate.jsonPath(), чтобы соединить миры JsonPath и JS, JsonPath может быть очень трудно писать и понимать. Вот почему я рекомендую использовать karate.filter(), чтобы сделать то же самое, но разбить шаги на простые, читаемые куски. Вот что вы можете попробовать во фри sh Scenario:. Подсказка, это хороший способ устранения неполадок в вашем коде без каких-либо «реальных» запросов.

* def getStatus = function(id){ var temp = karate.filter(response.jobs, function(x){ return x.id == id }); return temp[0].status }
* def response =
"""
{
  "jobs": [
    {
      "name": "job1",
      "id": "d6bd9aa1-0708-436a-81fd-cf22d5042689",
      "status": "pending"
    },
    {
      "name": "job2",
      "id": "4fdaf09f-51de-4246-88fd-08d4daef6c3e",
      "status": "pending"
    }
  ]
}
"""
* def selected = '4fdaf09f-51de-4246-88fd-08d4daef6c3e'
* print getStatus(selected)

Так что, если вы определили getStatus заранее, вы можете сделать это:

* retry until getStatus(selected) == 'completed'

Обратите внимание, что вы можете использовать несколько строк для функции JS, если вам не нравится сжимать все это в одну строку или даже читать из файла.

...