Bienvenidos sean a este post, hoy veremos una opcion de jest.
En el post anterior vimos como saber si una funcionn fue llamada o no, tambien si se le paso un argumento, pero jest tambien nos permite espiar si fue llamada. Para entenderlo vamos a utilizar el proyecto que creamos en este post, sino lo poseen les dejo un link para descargarlo:
Simplemente extraigan el directorio en el PC y ya esta listo para ser utilizado. Nuestro pimer paso sera ir a hola.spec.ts y modificaremos su codigo de la siguiente manera:
class MiClaseEspiada {
funcionTest() {
console.log("funcionTest llamada");
this.funcionEspiada();
}
funcionEspiada() {
console.log("funcionEspiada llamada");
}
}
it("deberia llamar a funcionEspiada", () => {
let miClaseEspiada = new MiClaseEspiada();
const funcionEspia = jest.spyOn(
miClaseEspiada, "funcionEspiada");
miClaseEspiada.funcionTest();
expect(funcionEspia).toHaveBeenCalled();
});
La clase contendra dos metodos, el primero indicara en consola que fue llamada y llamara al segundo metodo del objeto que creamos. El segundo metodo simplemente muestra en consola cuando fue llamado. Lo siguiente sera pasar al test.
Lo primero que haremos sera crear un objeto de la clase anterior. Luego crearemos un nuevo objeto que almacenarea el resultado devuelto por la funcion spyOn. Esta sera la encargada de espiar por nosotros. El primer argumento que le pasamos sera el objeto de la clase, y el segundo argumento sera una funcion dentro de la clase anterior para ser espiada. Nuestro siguiente paso sera llamar a la primera funcion desde el objeto creado. Y con expect pasaremos a la funcionEspia y le aplicamos la funcion toHaveBeenCalled para verificar si en algun momento es llamada. Con esto comentado probemos este test:
$ npm test
> testing@1.0.0 test
> jest
console.log
funcionTest llamada
at MiClaseEspiada.funcionTest (hola.spec.ts:3:11)
console.log
funcionEspiada llamada
at MiClaseEspiada.funcionEspiada (hola.spec.ts:7:11)
PASS ./hola.spec.ts (5.711 s)
✓ deberia llamar a funcionEspiada (276 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 6.953 s, estimated 64 s
Ran all test suites.
$
Como podemos ver tenemos las dos notificaciones de las llamadas de las funciones. Asi como tambien tenemos una notificacion de que el test fue pasado dado que se realizo la llamada a la funcion que pasamos en el expect. En el post anterior hablamos sobre el mock, algo muy similar a lo visto aqui, pero que tambien podemos implementarlo junto al spy. Para ver esto debemos tomar el bloque del test y modificarlo de la siguiente manera:
it("deberia llamar a funcionEspiada", () => {
let miClaseEspiada = new MiClaseEspiada();
const funcionEspia = jest.spyOn(
miClaseEspiada, "funcionEspiada")
.mockImplementation(() => {
console.log("mockImplementation llamada");
});
miClaseEspiada.funcionTest();
expect(funcionEspia).toHaveBeenCalled();
});
En el objeto encargado de espiar le hemos aplicado la funcion mockImplementation. Esta implementacion sera llamada durante el test y mostrara en consola un mensaje. El resto del bloque sigue siendo igual. Probemos nuevamente el test y veamos como es su salida:
$ npm test
> testing@1.0.0 test
> jest
console.log
funcionTest llamada
at MiClaseEspiada.funcionTest (hola.spec.ts:3:11)
console.log
mockImplementation llamada
at MiClaseEspiada.<anonymous> (hola.spec.ts:16:13)
PASS ./hola.spec.ts (53.812 s)
✓ deberia llamar a funcionEspiada (272 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 55.409 s
Ran all test suites.
$
Es muy similar al anterior pero tenemos una pequeña modificacion, se muestra el mensaje de la funcion mockImplementation pero no se muestra la del llamado a funcionTest porque fue reemplazada por esta y esta es una conducta muy interesante.
Cuando creamos un espia en un metodo nos permite chequear si el metodo fue invocado y fueron invocados con los parametros correctos, tal como vimos con mock, pero esto no esto evitara que sea visto el cuerpo del metodo. Para evitar esto y que no se invoque al cuerpo del metodo lo hacemos mediante mockImplementation como vimos en el ejemplo anterior. Esto es muy importante cuando escribimos tests. Tomemos como ejemplo que tenemos un metodo que se conecta a una base de datos, corre un query y devuelve un resultado pero no queremos que se ejecute el cuerpo del metodo porque tenemos una instancia de conexion a la base de datos, esta es una razon por la que se utiliza a mockImplementation.
Una cosa que podemos hacer es simular el valor que devolvemos de una funcion, dado que podemos hacerlo de manera muy simple con una mockImplementation. Vamos a hola.spec.ts y modifiquemos su codigo de la siguiente manera:
class MiClaseSimulada {
funcionSimulada(): number {
return 5;
}
}
it("deberia devolver un valor simulado", () => {
let miClaseSimulada = new MiClaseSimulada();
jest.spyOn(miClaseSimulada, "funcionSimulada")
.mockImplementation((): number => {
return 10;
});
expect(miClaseSimulada.funcionSimulada()).toEqual(10);
});
Este es muy similar al anterior codigo pero mas simple. Primero definimos una clase con un solo metodo donde solamente devuelve el valor de 5. Luego tenemos el test, donde primero creamos un objeto de esta clase. Lo siguiente es utilizar nuevamente a spyOn sobre el objeto y la funcion, tal como vimos antes, y volvemos a aplicar a mockImplementation. Pero en esta ocasion tenemos una funcion que devuelve el valor de 10. Lo siguiente es la utilizacion de expect y pasamos a la funcion simulada, para aplicarle un toEqual pero le pasamos el valor de 10. Que creen que sucedera? Probemos el test para ver su salida:
$ npm test
> testing@1.0.0 test
> jest
PASS ./hola.spec.ts (54.123 s)
✓ deberia devolver un valor simulado (83 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 55.562 s, estimated 59 s
Ran all test suites.
$
Como pueden observar el test paso con exito porque mediante el mockImplementation le pasamos otro valor para su devolucion, evitando que se ejecute el cuerpo del metodo. Antes de finalizar les dejo un link con todos los archivos utilizados y modificados en este post:
En resumen, hoy hemos visto como espia jest, que es, para que sirve, como se utiliza, un ejemplo para verlo en accion, y otro donde reemplaazamos el valor de una funcion. Espero les haya resultado 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
