Conociendo Stubs y Mocks

Andru
OrbisMobile
Published in
4 min readAug 10, 2018

Cuando desarrollamos aplicaciones consumiendo API’s o servicios web de terceros en nuestra app, tenemos la limitante de programar dependiendo de la disponibilidad del servicio, dado esta situación, nace la interrogante ¿Podría desarrollar mi app sin hacer uso de servicios?, la respuesta es Claro que si! 😉.

Para lograrlo necesitamos usar stubs y mocks 🤙.

Conceptos básicos

Stubs

Son aquellas funciones que se comportan como “relleno” ya que sustituyen a las funcionalidades que realmente dependen de nuestro código.

Una funcionalidad viene a ser una orden o conjunto de órdenes que tienen uno o muchos propósitos, Ej: Calcular la suma de 2 números ó retornar el precio total a pagar de un carrito de compras. 🤖

Por ejemplo, tenemos la siguiente función que tiene cierta lógica, llamada randomNumber:

Ahora aplicamos un stub en base a la función de arriba:

Como se visualiza, esta última función realiza una salida fija pero con el nombre randomNumber:

Ahora tenemos el siguiente ejemplo:

En este ejemplo, tenemos 2 parámetros de tipo función, que son success y fail, en este caso, necesitamos crear 2 stubs para cubrir el escenario en donde se ejecutará el parámetro success, y otra para el parámetro fail:

Mocks

Es muy similar a un stub, pero la diferencia es que se dedica a ser una copia de un objeto o de una clase, eso quiere decir de que aprovechamos el uso de protocolos para poder definir nuestros métodos que una clase debe tener:

Y normalmente lo usamos para crear una clase original* que implementará el protocolo, nuestra clase se llamará UserActions:

Ahora, implementamos nuestro protocolo a nuestra clase que toma el rol de mock, lo llamaremos MockUserActions:

Una clase original nos referimos a la clase que interactúa con data o servicios reales, o contiene la lógica de negocio de nuestro proyecto o aplicación.

Caso de uso

Vamos a hacer una aplicación que facilite la búsqueda de libros por autor bajo el servicio de openlibrary.org, y a la vez, listar/guardar los libros que deseo leer mas tarde.

Para ello realizamos un paquete en swift bajo docker, el código completo lo puede ver aquí.

Este es el diagrama de clases:

Aplicándolo en pruebas unitarias

Bajo una suite de pruebas unitarias, los stubs y mocks extienden su uso manteniendo su escencia, según el genial post Mocks aren’t stubs de Martin Fowler, nos explica no solamente de la confusión que suele pasar entre los stubs y mocks, sino también acerca de fakes y dummies 🤯.

En este caso nos centraremos en lo que define como stubs y mocks considerándolos como dobles.

Los dobles así como en las películas, donde en las escenas de alto riesgo se juegan la vida, en el ámbito de desarrollo, los dobles toman el lugar de nuestras funciones y clases originales.

Con esto en mente, lo aplicaré creando un paquete swift que crearé bajo:

  • Sistema operativo: linux/ubuntu
  • Versión de Swift: 4.0
  • Suite de testing: Quick
  • Para pruebas unitarias: nimble

Stubs

Nos ayuda a resolver las siguientes preguntas cuando desarrollamos:

  • ¿Mis pruebas unitarias funcionarán sin problemas cuando reemplace mi función original con un stub?
  • ¿Están preparados todos los escenarios tanto satisfactorios y fallidos cambiando mis funciones originales por stubs?

Como vemos, el uso de stubs bajo pruebas unitarias nos ayuda a verificar el estado de una función en nuestra aplicación, eso quiere decir, validar la responsabilidad de nuestra función original.

Como se visualiza, con estos stubs se simula los escenarios que puede suceder con el método request

Mocks

Nos facilita resolver nuestras dudas como:

  • ¿Se definió mi función?
  • ¿Se ejecutó mi función?
  • ¿Cuántas veces estoy ejecutando una función?

Estas preguntas hacen que cuando manejamos mocks bajo pruebas unitarias, estos se orienten a verificar el comportamiento de nuestra función, y para ello lo aprovechamos mediante el uso de clases y protocolos.

Como se visualiza, definimos una clase mock que simula la clase BookFinder

Usando nuestros stubs y mocks

Teniendo nuestras definiciones, como resultado tenemos las siguientes pruebas unitarias:

Mocks Parciales y completos

Al aplicar mocks, existen 2 tipos, los parciales y completos, estos son fáciles de detectar ya que un mock parcial simula una parte de una clase, mientras los completos son los que cubren todas las funcionalidades de una clase en base al protocolo definido.

Referencias

--

--