Mocking de Servicios Externos con NodeMailer en Pruebas Tuen
Clase 23 de 25 • Curso de End to End Testing para APIs REST con Node.js
Contenido del curso
Introducción: pruebas e2e con Node.js
- 2

Exploración y Configuración de APIs con Insomnia y Postman
10:37 min - 3

Pruebas en Node.js con Jest y Clean Architecture
10:06 min - 4

Configuración y uso de Jest para pruebas end-to-end en JavaScript
08:04 min - 5

Pruebas End-to-End con Supertest y Node.js
13:47 min - 6

Buenas prácticas en pruebas con Jest y manejo de ciclos abiertos
08:30 min
Pruebas a la API de Fake Store
- 7

Configuración de Entorno de Pruebas para Aplicaciones Node.js con Twen.js
11:25 min - 8

Generación de Reporte de Cobertura con Pruebas End to End
07:32 min - 9

Pruebas de Integridad de Datos con DTOs y Joy en APIs REST
20:16 min - 10

Pruebas End-to-End con Base de Datos en API REST
17:21 min - 11

Pruebas de Autenticación en Login con JavaScript
16:26 min - 12

Pruebas de Rutas Protegidas con API Key en Node.js
07:03 min - 13

Pruebas End-to-End con Access Token en API REST
14:16 min - 14

Pruebas Efectivas de Creación de Usuarios en POS con Bases de Datos
09:03 min
Pruebas en Entornos de Desarrollo Avanzados
- 15

Pruebas End-to-End: Gestión de Datos con Semillas Automatizadas
10:26 min - 16

Configuración de Bases de Datos para Pruebas End-to-End con Docker
17:57 min - 17

Creación de Sets de Datos Manuales para Pruebas End-to-End
15:49 min - 18

Sets de Datos en SQLite: Creación y Gestión Efectiva
14:58 min - 19

Uso de Unsook para Migraciones Programáticas en Pruebas
10:53 min - 20

Pruebas de API: Creación de Categorías con Roles y Tokens
10:28 min - 21

Pruebas End-to-End para API de Productos sin Autenticación
06:01 min - 22

Pruebas de Paginación en Endpoints de Productos con Limit y Offset
04:38 min
Mocking y automatización
Próximos pasos
¿Qué es el mocking y por qué es importante en las pruebas?
El uso de mocking se convierte en una herramienta esencial al realizar pruebas de aplicaciones complejas, especialmente cuando se trabajan con servicios externos que escapan a nuestro control. En el testing de software, el mocking permite simular el comportamiento de ciertos componentes o servicios para verificar cómo la aplicación responde a diversas condiciones sin depender de servicios externos reales.
¿Por qué necesitamos hacer mocking?
Durante la ejecución de pruebas end-to-end, tratamos de integrar la mayor cantidad de componentes posibles de nuestra aplicación, incluyendo bases de datos y servicios externos. Sin embargo, llega un punto en el que no es factible o posible asegurar toda la funcionalidad de estos servicios de terceros, como es el caso de APIs externas o servicios de correo electrónico.
Razones para usar mocking:
- Control limitado: APIs externas o servicios como NodeMailer para el envío de correos electrónicos no están bajo nuestro control directo, lo que complica la validación de su correcta ejecución.
- Consumo de recursos: Llamar frecuentemente a servicios de terceros, como tecnología de procesamiento de imágenes de Microsoft, puede aumentar costos innecesarios si se usan sin restricciones.
- Pruebas intencionadas: Utilizar datos falsos para simular condiciones específicas y verificar la respuesta de la aplicación, sin involucrar servicios reales que podrían causar un mal uso.
¿Cómo funciona el mocking con NodeMailer?
Un caso práctico de mocking se da al trabajar con la función NodeMailer, la cual gestiona el envío de correos electrónicos, como se describió en el ejemplo de recuperación de contraseñas. Al enviar un correo para recuperar una contraseña, no se puede verificar si el correo llegó con éxito, ya que no tenemos acceso a la base de datos de servicios como Gmail. Por lo tanto, emulamos mediante mocking que el correo ha sido enviado.
Implementación del mocking:
-
Definición del EndPoint: La aplicación recibe un email para verificar si el usuario existe y firma un JWT que se guardará en la base de datos para el proceso de recuperación de contraseña.
-
Envío de Email: Aquí reside el mayor desafío, ya que no podemos confirmar la entrega del correo en Gmail. Simularemos esta acción asegurando que supuestamente se ha enviado con éxito.
Código de Mocking:
// Definimos la funcionalidad de mocking en Jest
const mockSendMail = jest.fn();
jest.mock('nodemailer', () => {
return {
createTransport: jest.fn().mockImplementation(() => {
return {
sendMail: mockSendMail
};
})
};
});
// Simulamos el comportamiento esperado
mockSendMail.mockResolvedValue(true);
¿Qué hacer si las pruebas fallan?
Al ejecutar pruebas, hemos de asegurarnos que las funciones simuladas estén siendo llamadas correctamente. En caso de errores, como en las credenciales de SMTP, es crucial que las pruebas no se detengan, ya que están diseñadas para ser independientes del correo electrónico real.
Uso de console.log para depuración
El console.log sigue siendo una herramienta valiosa cuando necesitamos comprender la salida de nuestras pruebas, especialmente para identificar dónde se están produciendo los errores. Esto ayuda no solo a encontrar errores en mi código, sino también en mi lógica de pruebas:
console.log(body); // Ayuda a depurar
¿Qué sigue después de implementar el mocking?
Una vez que hemos asegurado que nuestras pruebas funcionan eficientemente mediante mocking, podemos avanzar hacia la automatización de pruebas en plataformas como GitHub Actions. Esto nos permitirá ejecutar nuestras pruebas con cada cambio en el código de manera eficiente, garantizando siempre la calidad y estabilidad de nuestra aplicación.