Anuncios

Bienvenidos sean a este post, hoy veremos una opcion de jest.

Anuncios

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:

Anuncios

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();
});
Anuncios

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.

Anuncios
Anuncios

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.
$
Anuncios

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();
});
Anuncios

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.
$
Anuncios

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.

Anuncios
Anuncios

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.

Anuncios

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);
});
Anuncios
Anuncios

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.
$
Anuncios

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:

Anuncios

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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50