MockImplementationOnce para potenciar tus pruebas en Jest

| Última modificación: 17 de octubre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo vamos a hablar de un tema esencial que no solo potenciará tus habilidades de prueba, sino que también te dará una ventaja competitiva en el mercado laboral del desarrollo web. Nos referimos a cómo aprovechar MockImplementationOnce en Jest para optimizar nuestras pruebas.

¿Qué es MockImplementationOnce y por qué es importante?

En Jest, mockImplementationOnce es una funcionalidad que nos permite definir una implementación personalizada del comportamiento de una función (también conocida como mock function) en su próxima llamada.

Pero ¿por qué debería importarnos esta funcionalidad? Imagina que estás trabajando en un código con funciones complejas que interactúan con API o bases de datos. No siempre es práctico (ni recomendable) hacer llamadas a servicios reales cada vez que ejecutas tus pruebas. Aquí es donde los mocks son útiles y mockImplementationOnce en concreto se convierte en una herramienta poderosa.

Con mockImplementationOnce, puedes definir respuestas específicas para tus mocks y simular diferentes escenarios de respuesta de una API, por ejemplo. De esta manera, puedes escribir pruebas más robustas y predecibles.

Cómo utilizar MockImplementationOnce en Jest

Ahora, vamos a ver cómo se utiliza mockImplementationOnce en Jest. Supón que tienes una función que realiza una llamada a una API para obtener el nombre de un usuario:

async function getUserName(userId) {
  const response = await fetch(`https://api.example.com/users/${userId}`);
  const user = await response.json();
  return user.name;
}

Para probar esta función, podrías hacer algo como esto:

it('fetches the user name', async () => {
  const mockSuccessResponse = { name: 'John Doe' };
  global.fetch = jest.fn().mockImplementationOnce(() =>
    Promise.resolve({
      json: () => Promise.resolve(mockSuccessResponse),
    })
  );

  const userName = await getUserName(1);

  expect(userName).toEqual('John Doe');
  expect(global.fetch).toHaveBeenCalledTimes(1);
  expect(global.fetch).toHaveBeenCalledWith(
    'https://api.example.com/users/1'
  );
});

En este ejemplo, estamos usando mockImplementationOnce para simular la respuesta de fetch con un objeto que tiene una propiedad json, que es una promesa resuelta con nuestros datos simulados (mockSuccessResponse). Luego, verificamos que nuestra función se comporta como esperamos, comprobando que fetch se haya llamado una vez con la URL correcta, y que devuelva el nombre de usuario indicado.

Ventajas de usar MockImplementationOnce

  1. Flexibilidad. MockImplementationOnce permite definir comportamientos únicos para cada llamada de la función simulada. Esta característica otorga gran flexibilidad en la simulación de diferentes escenarios en una serie de llamadas de función.
  2. Optimización del rendimiento. En muchas situaciones, las llamadas a funciones en el código de producción pueden ser intensivas en recursos o tiempo. Al usar MockImplementationOnce, se pueden evitar esas costosas llamadas durante las pruebas, de modo que se optimiza el tiempo de ejecución de las pruebas.
  3. Control sobre el flujo de la prueba. Permite tener un mayor control sobre el flujo de la prueba. Puedes diseñar una serie de resultados de función para probar el comportamiento de tu código bajo diferentes circunstancias y observar cómo maneja estas variaciones.
  4. Pruebas de error más efectivas. Facilita la simulación de comportamientos de error. Esto es útil para probar cómo se manejan las excepciones o errores en tu código, un aspecto esencial de la prueba que a veces puede ser difícil de lograr con pruebas tradicionales.
  5. Mayor confianza en las pruebas. Al utilizar MockImplementationOnce, puedes estar seguro de que tus pruebas son realmente aisladas y no se ven afectadas por factores externos, como la red o la disponibilidad de una API. Esto puede resultar en pruebas más fiables y resultados más consistentes.

Consideraciones adicionales

Algunos aspectos que deberías tener en cuenta al trabajar con mockImplementationOnce son:

  1. mockImplementationOnce se aplica solo a la siguiente llamada a la función. Si tu función se llama más de una vez en la misma prueba, necesitarás encadenar llamadas a mockImplementationOnce para definir comportamientos diferentes en cada llamada.
  2. No olvides hacer mockReset o mockRestore después de cada prueba para limpiar tu mock y asegurarte de que no afecte a otras pruebas. Esto te ayudará a evitar sorpresas desagradables cuando estés ejecutando tu suite de pruebas.

Como has visto, MockImplementationOnce en Jest es una herramienta poderosa que te permite simular el comportamiento de tus funciones y escribir pruebas más robustas. Sin embargo, recuerda que la práctica hace al maestro. Cuanto más practiques estas técnicas, más cómodo te sentirás al usarlas en situaciones de la vida real.

¿Quieres saber más?

El Desarrollo Web Full Stack Bootcamp de KeepCoding no solo te brinda las habilidades técnicas que necesitas para sobresalir en el mercado laboral, sino que también te da la oportunidad de aplicar lo que aprendes en proyectos que puedes mostrar a los futuros empleadores. Con esta formación intensiva e íntegra a nivel teórico y práctico, en cuestión de meses estarás listo para abrirte paso en el mercado laboral IT, una industria con una alta demanda de profesionales que ofrece salarios competitivos. ¿Quieres darle un impulso a tu carrera? ¡Solicita información y conviértete en un desarrollador profesional!

Alberto Casero

Alberto Casero es CTO en Watium, Fundador de Kas Factory & Coordinador del Bootcamp en Desarrollo Web.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Desarrollo Web

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado