Повторите рамки каратэ, пока не работает, как ожидалось - PullRequest
1 голос
/ 24 апреля 2019

Я использую фреймворк для каратэ с JUnit.

Использование этой функции:

Given path 'save_token'
And request
"""
{
  "token": "test_token"
}
"""
And retry until response.tokens ==
"""
[
    "test_token"
]
"""
When method POST

У меня есть исключение:

java.lang.ArrayIndexOutOfBoundsException: 1
    at com.intuit.karate.core.MethodMatch.convertArgs(MethodMatch.java:60)
    at com.intuit.karate.core.Engine.executeStep(Engine.java:141)
    at com.intuit.karate.core.ScenarioExecutionUnit.execute(ScenarioExecutionUnit.java:171)

Когда список response.tokens пуст:

{
    "tokens": []
}

Я не понимаю, почему == не работает в этом случае (он должен возвращать false и продолжать повторную попытку).

Заранее спасибо!

1 Ответ

3 голосов
/ 24 апреля 2019

Выражение 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

...