Выражение retry
должно быть чистым JavaScript, и специальные ключевые слова соответствия каратэ, такие как contains
, не поддерживаются, и вы не можете сделать «глубокое равенство», например, как вы пытаетесь, так как это тоже не так. возможно в JS.
Итак, если ваш ответ { "tokens": [ "value1" ] }
, вы можете сделать это:
And retry until response.tokens.contains('value1')
Или:
And retry until response.tokens[0] == 'value1'
Чтобы поэкспериментировать, вы можете попробовать выражения вроде этого:
* def response = { "tokens": [ "value1" ] }
* assert response.tokens.contains('value1')
Во время выполнения вы можете использовать JS для обработки условий, когда ответ еще не готов во время опроса:
And retry until response.tokens && response.tokens.length
РЕДАКТИРОВАТЬ: на самом деле более элегантный способ сделать это показано ниже, потому что karate.get()
изящно обрабатывает ошибку оценки JS или JsonPath и возвращает null
:
And retry until karate.get('response.tokens.length')
И если вы действительно хотите использовать силу синтаксиса match
каратэ, вы можете использовать JS API :
And retry until karate.match(response, { tokens: '##[_ > 0]' }).pass
Обратите внимание, что если у вас более сложная логика, вы всегда можете превратить ее в функцию многократного использования:
* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
Наконец, если ничего из вышеперечисленного не работает, вы всегда можете перейти к пользовательской процедуре опроса: polling.feature