Vuelva a intentar el marco de Karate hasta que no funcione como se esperaba
Estoy usando el marco Karate con JUnit.
Usando esta característica:
Given path 'save_token'
And request
"""
{
"token": "test_token"
}
"""
And retry until response.tokens ==
"""
[
"test_token"
]
"""
When method POST
Tengo esta excepción:
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)
Cuando la lista de tokens de respuesta está vacía:
{
"tokens": []
}
No entiendo por qué == no funciona en este caso (debería devolver falso y seguir intentando).
¡Gracias de antemano!
La retry until
expresión tiene que ser JavaScript puro y las palabras clave especiales de coincidencia de Karate, como contains
no son compatibles, y no puedes hacer "iguales profundos" como lo estás intentando, ya que eso tampoco es posible en JS.
EDITAR: en 0.9.6. en adelante puedes hacer un complejo match
en JS: https://stackoverflow.com/a/50350442/143475
También tenga en cuenta que JsonPath no es compatible, lo que significa *
que ..
no puede aparecer en la expresión.
Entonces, si tu respuesta es { "tokens": [ "value1" ] }
, puedes hacer esto:
And retry until response.tokens.includes('value1')
O:
And retry until response.tokens[0] == 'value1'
Para experimentar, puedes probar expresiones como esta:
* def response = { "tokens": [ "value1" ] }
* assert response.tokens.includes('value1')
En tiempo de ejecución, puede usar JS para encargarse de las condiciones cuando la respuesta aún no está lista durante el sondeo:
And retry until response.tokens && response.tokens.length
EDITAR: en realidad, a continuación se muestra una forma más elegante de hacer lo anterior, porque karate.get()
maneja con elegancia un error de evaluación de JS o JsonPath y devuelve null
:
And retry until karate.get('response.tokens.length')
O si trabaja con XML, puede utilizar la karate.xmlPath()
API:
And retry until karate.xmlPath(response, '//result') == 5
Y si realmente quieres utilizar el poder de match
la sintaxis de Karate, puedes utilizar la API JS :
And retry until karate.match(response, { tokens: '##[_ > 0]' }).pass
Tenga en cuenta que si tiene una lógica más compleja, siempre puede incluirla en una función reutilizable:
* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
Finalmente, si nada de lo anterior funciona, siempre puedes cambiar a una rutina de sondeo personalizada:polling.feature
EDITAR: consulte también esta respuesta para ver un ejemplo de cómo usarlo karate.filter()
en lugar de JsonPath: https://stackoverflow.com/a/60537602/143475