Ir al contenido principal
Versión: 5.8.x

Hasta

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Al probar código no determinista, un caso de uso común es "espero que este código pase después de un breve período de tiempo".

Por ejemplo, podrías querer verificar que un mensaje ha sido recibido por un broker. Podrías establecer un límite de tiempo y sondear repetidamente hasta recibir el mensaje, pero esto bloquearía el hilo. Además, tendrías que escribir el código del bucle, añadiendo redundancia.

Como alternativa, Kotest proporciona la función until que ejecutará periódicamente una función hasta que esta devuelva true o expire la duración especificada.

Until es el equivalente predicativo de eventually.

Duración

Supongamos que tenemos una función que sondea un broker y devuelve una lista de mensajes. Queremos probar que al enviar un mensaje, este es recogido por el broker en un plazo de 5 segundos.

class MyTests : ShouldSpec() {

private val broker = createBrokerClient()

init {
should("broker should receive a message") {
sendMessage()
until(5.seconds) {
broker.poll().size > 0
}
}
}
}

Intervalo

Por defecto, el predicado se comprueba cada segundo. Podemos especificar un intervalo que controle el retraso entre invocaciones. Este es el mismo ejemplo, ahora con un intervalo fijo más agresivo de 250 milisegundos.

class MyTests : ShouldSpec() {

private val broker = createBrokerClient()

init {
should("broker should receive a message") {
sendMessage()
until(5.seconds, 250.milliseconds.fixed()) {
broker.poll().size > 0
}
}
}
}

También podemos especificar un intervalo de Fibonacci si queremos aumentar el retraso tras cada fallo.

class MyTests : ShouldSpec() {

private val broker = createBrokerClient()

init {
should("broker should receive a message") {
sendMessage()
until(5.seconds, 100.milliseconds.fibonacci()) {
broker.poll().size > 0
}
}
}
}