空手道框架重试,直到无法正常工作

时间:2019-04-23 23:27:10

标签: karate

我将Karate框架与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 个答案:

答案 0 :(得分:3)

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

如果您真的想使用空手道的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