Ir al contenido principal
Versión: 5.6.x

Generadores personalizados

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

Para crear tu propio generador para un tipo T, simplemente creas una instancia de Arb<T> o Exhaustive<T>.

Arbitrario

Al crear un arbitrario personalizado, podemos usar el constructor arbitrary que acepta una lambda que debe devolver el tipo que estamos generando. El parámetro de esta lambda es un RandomSource que contiene la semilla y la instancia Random. Normalmente deberíamos usar el RandomSource proporcionado si necesitamos acceso a una instancia kotlin.Random, ya que esta instancia habrá sido inicializada por el framework para permitir pruebas repetibles.

Por ejemplo, aquí tenemos un arb personalizado que genera un entero aleatorio entre 3 y 6 usando el constructor arbitrary.

val sillyArb = arbitrary { rs: RandomSource ->
rs.random.nextInt(3..6)
}

Además del parámetro RandomSource, la lambda de construcción arbitraria también proporciona el contexto ArbitraryBuilderSyntax que podemos aprovechar para componer otros arbitrarios al construir el nuestro.

Por ejemplo, aquí tenemos un Arbitrary que soporta una clase personalizada llamada Person, delegando en un arbitrario String y otro Int.

data class Person(val name: String, val age: Int)

val personArb = arbitrary {
val name = Arb.string(10..12).bind()
val age = Arb.int(21, 150).bind()
Person(name, age)
}

El arbitrario resultante producido con esta sintaxis es equivalente a usar map, flatMap y bind.

Exhaustivo

Al crear un exhaustivo personalizado, podemos usar la función de extensión exhaustive() sobre una Lista. ¡Realmente no hay más que eso!

val singleDigitPrimes = listOf(2,3,5,7).exhaustive()
class PropertyExample: StringSpec({
"testing single digit primes" {
checkAll(singleDigitPrimes) { prime ->
isPrime(prime) shouldBe true
isPrime(prime * prime) shouldBe false
}
}
})