Bienvenidos sean a este post, hoy veremos una opcion de jest.
Una condicion que nos puede ocurrir es que necesitemos repetir tests una X cantidad de veces con distintos valores de ingreso. Para ver este concepto vamos a necesitar nuestro proyecto creado en este post, sino lo poseen les dejo un link para descargarlo:
Simplemente extraigan el directorio en el PC y esta listo para ser usado. Con esto realizado nuestro primer paso sera ir al archivo hola.spec.ts y modificaremos el codigo de la siguiente manera:
[1, 2, 3, 4, 5].forEach((valor: number) => {
it(valor + " deberia ser menor que 5", () => {
expect(valor).toBeLessThan(5);
});
});
Primero tenemos un array de cinco valores y a este le aplicamos un forEach. Esta funcion solo recibe una funcion como argumento, la cual se aplicara a cada valor. En esta recibiremos el valor de cada pasada y en la funcion aplicaremos el test donde el valor recibido le adjuntamos un mensaje para representarlo y en el expect comparamos el valor recibido con la funcion toBeLessThan donde siempre sera true si el valor de esta funcion es menor que el recibido, de lo contrario devolvera un false. Probemos de correr el test y ver su salida:
$ npm test
> testing@1.0.0 test
> jest
FAIL ./hola.spec.ts (53.65 s)
✓ 1 deberia ser menor que 5 (114 ms)
✓ 2 deberia ser menor que 5 (13 ms)
✓ 3 deberia ser menor que 5 (17 ms)
✓ 4 deberia ser menor que 5 (14 ms)
✕ 5 deberia ser menor que 5 (57 ms)
● 5 deberia ser menor que 5
expect(received).toBeLessThan(expected)
Expected: < 5
Received: 5
1 | [1, 2, 3, 4, 5].forEach((valor: number) => {
2 | it(valor + " deberia ser menor que 5", () => {
> 3 | expect(valor).toBeLessThan(5);
| ^
4 | });
5 | });
6 |
at Object.<anonymous> (hola.spec.ts:3:17)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 4 passed, 5 total
Snapshots: 0 total
Time: 54.85 s, estimated 67 s
Ran all test suites.
$
En este caso fallo porque no se cumplio la condicion del test, un valor recibido no era menor a 5, y por lo tanto no solo informo sino que tambien nos muestra donde fallo, y los totales pasados y fallados. Esto lo usamos como introduccion para entender el concepto porque mediante forEach lo podemos hacer de manera rapida y practica pero vamos a analizar un ejemplo practico sobre este tema. Para ello volveremos al archivo anterior y cambiaremos el codigo por el siguiente:
function tieneValorSinEspacio(valor: string): boolean {
if (valor && valor.length > 0 && valor.trim().length > 0) {
return true;
}
return false;
}
function usandoTest<T> (valores: T[], func: Function) {
for(let valor of valores) {
func.apply(Object, [valor]);
}
}
usandoTest(
[
[undefined, false],
[null, false],
[" ", false],
[" ", false],
[" a ", true]
],
([valor, esValido]: [string, boolean]) => {
it(valor + " tieneValorSinEspacio ? " + esValido,
() => {
esValido ?
expect(tieneValorSinEspacio(valor)).toBeTruthy() :
expect(tieneValorSinEspacio(valor)).toBeFalsy();
}
);
}
);
Un codigo mucho mas bello, no? Primero definiremos una funcion que basicamente verifica que el valor recibido posee un valor, y a su vez su longitud sea mayor a 0 y por ultimo que el resultado de trim sea mayor a 0. Es decir solamente si existe un elemento y que no sean espacios en blanco devolvera un true para indicar esto. Si alguna de las condiciones anteriores no se cumplen procede a devolver un false. Cuando lo apliquemos veremos como funciona realmente. La segunda funcion sera con la que aplicaremos el test. Esta recibira dos argumentos, el primero sera un array de tipo generico y la siguiente sera una funcion. En el bloque de esta pasaremos por todos lo elementos del array y mediante apply pasaremos cada valor a la funcion.
Ya vimos a las dos funciones, pasemos a aplicar la segunda. En este caso le pasamos como dato una serie de tuples con dos valores. El primero sera el que evaluaremos mediante la primer funcion y el expect, el segundo es para indicar cual es el valor que examinara. En la funcion tomaremos estos dos valores de cada tuple en cada pasada. Con nuestros valores en la funcion aplicaremos el test, y para generar la identificacion del mismo pasaremos los valores recibidos. En la funcion tomaremos el segundo valor y lo evaluaremos con el operador condicional si es true lo pasaremos a un expect que toma el resultado de la primera funcion con el primer valor recibido y lo compara con toBeTruthy donde solo pasara si este es true. En cambio si el valor de esValido es false lo pasara al «else» de este operador donde hara lo mismo pero con la toBeFalsy y pasara el test si es false. Con todo esto comentado probemos para ver como es la salida:
$ npm test
> testing@1.0.0 test
> jest
PASS ./hola.spec.ts (56.853 s)
✓ undefined tieneValorSinEspacio ? false (51 ms)
✓ null tieneValorSinEspacio ? false (8 ms)
✓ tieneValorSinEspacio ? false (8 ms)
✓ tieneValorSinEspacio ? false (6 ms)
✓ a tieneValorSinEspacio ? true (11 ms)
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 59.126 s
Ran all test suites.
$
Como pueden ver paso con exito porque los primeros cuatro casos al pasarlo a tieneValorSinEspacio devolvera un false, dado que no cumple con la condicion en este, pero el ultimo si porque si bien tiene espacios en blanco tenemos un contenido y al aplicarle un trim, donde se limpian dichos espacios, tendremos un valor de longitud mayor a 0. Este es un ejemplo mas real de como podemos probar nuestros test bajo ciertas circunstancias muy especiales y a su vez repetir el mismo con distintos valores y condiciones. Antes de finalizar les dejo un link con todos los archivos utilizados y modificados en este post:
En resumen, hoy hemos visto como es un test conducido por datos, como pueden ser, una manera practica de hacerlo, otra mediante dos funciones, asi como tambien podemos controlar nuestro expect de acuerdo al valor que le indicamos. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
