Objetos Mock y Fixtures en JavaScript: tu arsenal de pruebas
\n\nImagina que estás escribiendo un módulo que envía solicitudes a una API externa del clima. Ejecutas las pruebas y fallan porque la API no está disponible temporalmente. O peor aún: pruebas un sistema de pago y cada ejecución descuenta dinero real de la tarjeta. ¿Te suena familiar? Bienvenido al mundo donde los objetos mock y fixtures en JavaScript se convierten en tus mejores amigos.
\n\nEn este artículo no solo enumeraremos definiciones. Analizaremos cómo hacer que las pruebas sean rápidas, confiables e independientes del mundo exterior usando mocks, stubs y fixtures. Aprenderás cómo engañar a los temporizadores, suplantar solicitudes HTTP y preparar datos de prueba ideales. ¡Allá vamos!
\n\n¿Para qué sirven los mock y fixtures? Dolor y salvación
\n\nCuando escribes pruebas unitarias en JavaScript, quieres verificar solo un módulo. Pero el código real a menudo depende de bases de datos, sistema de archivos, llamadas de red o números aleatorios. Sin mocks, cada prueba es una lotería: puede fallar por un tiempo de espera de red o porque el servidor devolvió datos incorrectos.
\n\nLos objetos Mock son sustitutos de las dependencias reales. Imitan el comportamiento de los objetos originales, pero tú controlas completamente sus respuestas. Los Fixtures son conjuntos de datos preparados de antemano (por ejemplo, un JSON con la respuesta de una API) que introduces en las pruebas. Juntos te dan un superpoder: pruebas la lógica, no la infraestructura.
\n\nMock vs Stub vs Spy: aclarando los términos
\n\nAntes de escribir código, pongamos orden en los términos. En el ecosistema de JavaScript (especialmente en Jest y Mocha), estos conceptos a veces se mezclan, pero las diferencias son importantes:
\n\n- \n
- Mock — un objeto que reemplaza una dependencia real y permite definir el comportamiento esperado. Le dices: «Cuando se llame al método getUser con id=5, devuelve el objeto {name: 'Alice'}». \n
- Stub — una versión simplificada del mock. Simplemente devuelve datos fijos, sin verificar cómo se le llamó. A menudo se usa para reemplazar funciones que devuelven valores aleatorios. \n
- Spy — un envoltorio sobre una función real. No cambia su comportamiento, pero registra cuántas veces se llamó, con qué argumentos y qué devolvió. Ideal para verificar efectos secundarios. \n
En la mayoría de los frameworks modernos (Jest, Sinon.js), los mocks pueden hacer de todo: tanto suplantar la implementación como espiar. Pero entender la diferencia te ayudará a escribir pruebas más significativas.
\n\nFixtures: cómo preparar datos de prueba
\n\nLos fixtures en pruebas de JavaScript son simplemente datos que extraes en archivos o variables separadas. ¿Por qué es necesario? Primero, para no duplicar objetos JSON de 50 líneas en cada prueba. Segundo, para cambiar rápidamente los escenarios: un fixture para una respuesta exitosa, otro para un error.
\n\nEjemplo de un fixture simple para probar un módulo de gestión de usuarios:
\n\n// fixtures/users.js\nexport const userAlice = {\n id: 1,\n name: 'Alice',\n email: 'alice@example.com',\n role: 'admin'\n};\n\nexport const userBob = {\n id: 2,\n name: 'Bob',\n email: 'bob@example.com',\n role: 'user'\n};\n\nexport const apiResponseSuccess = {\n status: 200,\n data: { users: [userAlice, userBob] }\n};\n\nexport const apiResponseError = {\n status: 500,\n message: 'Internal Server Error'\n};\n\n\nAhora en las pruebas simplemente importamos estos objetos. Esto hace que el código sea más limpio y permite reproducir casos fácilmente: «¿Y si el servidor devolvió un 500?».
\n\nMock en Jest: ejemplos prácticos
\n\nJest es el framework de pruebas más popular para JavaScript. Está integrado en Create React App, Next.js y muchas otras herramientas. Veamos cómo crear objetos mock en Jest.
\n\nFunción Mock con jest.fn()
\n\nSupongamos que tenemos una función que llama a un callback después de procesar datos