Ir al contenido principal
Versión: 6.2 🚧

Afirmaciones Suaves

[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 →

Normalmente, afirmaciones como shouldBe lanzan una excepción cuando fallan. Pero a veces quieres realizar múltiples afirmaciones en una prueba y ver todas las que han fallado. Kotest proporciona la función assertSoftly para este propósito.

assertSoftly {
foo shouldBe bar
foo should contain(baz)
}

Si alguna afirmación dentro del bloque falla, la prueba continuará ejecutándose. Todos los fallos se reportarán en una única excepción al final del bloque.

Otra versión de assertSoftly toma un objetivo de prueba y una lambda que tiene al objetivo de prueba como receptor.

assertSoftly(foo) {
shouldNotEndWith("b")
length shouldBe 3
}

Podemos configurar las afirmaciones suaves para que se añadan implícitamente a cada prueba mediante la configuración del proyecto.

Nota: solo las aserciones propias de Kotest pueden ser aserciones suaves. Para ser compatibles con assertSoftly, las aserciones de otras bibliotecas deben envolverse en shouldNotThrowAny, como se describe más adelante. Si otras comprobaciones fallan y lanzan un AssertionError, no respetarán assertSoftly y emergerán, borrando los resultados anteriores. Esto incluye la propia función fail() de Kotest. Por ejemplo, en este código no sabremos si la primera aserción foo shouldBe bar tuvo éxito o falló:

assertSoftly {
foo shouldBe bar
fail("Something happened")
}

Ten en cuenta, sin embargo, que failSoftly es compatible con assertSoftly, por lo que el siguiente código reportará ambos fallos:

assertSoftly {
2*2 shouldBe 5
failSoftly("Something happened")
}

Asimismo, si verify(...) de mockk falla en este ejemplo, la segunda aserción no se ejecutará:

assertSoftly {
verify(exactly = 1) { myClass.myMethod(any()) }
foo shouldBe bar
}

Por tanto, para usar aserciones no-Kotest dentro de bloques assertSoftly, deben invocarse mediante shouldPass. En este ejemplo, tanto verify como la segunda aserción pueden fallar, y obtendremos ambos errores acumulados:

assertSoftly {
shouldNotThrowAnyUnit {
verify(exactly = 1) { myClass.myMethod(any()) }
}
foo shouldBe bar
}

De igual forma, en este ejemplo el fallo de verify no se ignorará y se añadirá al fallo de la primera aserción:

assertSoftly {
(2+2) shouldBe 5
shouldNotThrowAnyUnit {
verify(exactly = 1) { myClass.myMethod(any()) }
}
}

Nota: por diseño, algunas aserciones propias de Kotest no son compatibles con assertSoftly, entre ellas:

  • shouldCompleteWithin

  • shouldCompleteBetween

  • shouldNotThrowExactly

  • shouldNotThrowMessage

  • shouldThrow

  • shouldThrowExactly

  • shouldThrowExactlyUnit

  • shouldNotThrowExactlyUnit

  • shouldThrowMessage

  • shouldThrowUnit

  • shouldThrowUnitWithMessage

  • shouldThrowWithMessage

  • shouldTimeout

Pero shouldThrowSoftly es compatible con assertSoftly.