Unit testing con rxjs

Featured image

Unit testing & rxjs operators

Buenasss hemos regresado!! felíz 2021! mejor tarde que nunca.. y siii estrenamos este año con un pequeño post sobre lo que nos encanta escribir: unit testinggggggg A esta altura nos encanta daleeeeee que se enter image description here

Voy a seguir un poco mas dando ejemplos sobre Jasmine, peeeeero proximamente estare viendo de migrar a Jest, asi que atentisssss a esoooo

Bueno yyyy vamos a lo que nos compete…como siempre, la idea es seguir haciendo post pequeños que nos guste leer, concretos, cortitos, simplessss asi que vamos con esa! Hoy quiero apuntar a los tests con ciertos operadores rxjs como el concatMap y desmentir algunos mitos

concatMap

Este operador según la definición “*concatMap does not subscribe to the next observable until the previous completes*” , es decir, concatena *secuencialmente* nuestras suscripciones, suponiendo que si la primera o alguna de ellas falla o está empty, no continuará la secuencia y se frenará.

Veamos un ejemplo de esto, en nuestro componente podemos tener llamadas concatenadas, conceptualmente hablando seria algo como:

    this.service
      .method()
      .pipe(
        concatMap(() => {
          return this.service2.method();
        })
      )
      .pipe(
        concatMap(() => {
          return this.service2.method2();
        })
      )
      .pipe(
        concatMap(() => {
          return this.service3.method();
        })
      )
      .subscribe(
        () => {
          console.log('josha!!!');
        },
        (error) => {
          console.log('upsis');
        }
      )

No importa si queremos concatenar metodos del mismo servicio o de diferentes servicios o bla bla.

Lo que sí nos importa es que, para cuando hacemos el unit test de un caso asi sepamos lo que podemos hacer:

  1. No es necesario ejecutar el test en una zona asíncrona como podría pensarse (usando fakeAsync o async), o aplicando marble testing, entonces se puede testear de manera síncrona y sencilla.

  2. Es importante que entendamos la definición, “no continuará si falla alguna de las suscripciones”. Esto es lo mas importante. Si en nuestros tests tenemos tests doubles (mediante servicios stubbeados) y/o Spies, tenemos que tener en cuenta que los metodos de nuestros servicios que están involucrados en esa concatenación, DEBEN DEVOLVER ALGOOO

enter image description here

En este caso debemos tener cuidado porque si cualquiera de esos metodos no devuelve un observable con alguillo: que secuencia? no hay secuencia.

Para verlo mejor con el ejemplo anterior seria que en nuestro mock, stub o spy tengamos en el return de esos metodos algo como

    return of('holis')

ó aunque sea:

    return of({})

porque si solamente devolvemos un observable pelado enter image description here

    return of()

al hornooooo al hornoooooooo!! enter image description here

bue che tampoco para tanto, pero no va a andar ni pa delante ni pa tras, esos concatMap van a quedar en el eterno resplandor de una mente sin recuerdo, es decir, en el eterno limbo

enter image description here

Asi que bueno, eso es todo amigos, espero que les haya servido y que les haya gustado chau!