NestJS + Jest: ¿cómo recibir solicitudes HTTP externas dentro de una prueba de integración?
Objetivo
En mi configuración tengo dos aplicaciones. La Aplicación A (de un tercero) recibe la entrada del usuario, la procesa y luego envía los datos procesados a través de una petición POST a la Aplicación B (mi servidor NestJS). Quiero ejecutar una prueba de integración, donde quiero validar las variables internas de la Aplicación B frente a la entrada del usuario. Para ello, quiero definir las pruebas dentro de B que realicen los siguientes pasos:
– enviar una entrada de usuario predefinida a A
– recibir una petición POST de A
– realizar algún procesamiento
– validar el procesamiento
Al definir las pruebas dentro de B, se debe tener la posibilidad de examinar la cobertura de código para las pruebas de integración. No puedo hacer esto si escribo otra aplicación que realiza pruebas externamente.
Problema
No encontré ninguna forma de recibir solicitudes HTTP externas dentro de las pruebas con Jest. Mi enfoque sería crear un módulo con un controlador y luego escuchar en el puerto. Por ejemplo, así:
describe('Prueba de Integración', () => {
beforeAll(async () => {
const testingModule: TestingModule = await Test.createTestingModule(
{
imports: [HttpModule],
providers: [IntegrationTestService],
controllers: [IntegrationTestController],
},
).compile();
await testingModule.listen(3000);
// aquí defino mis pruebas
});
})
```
Pero TestingModule no proporciona la función "listen". Tampoco logré que funcionara usando un módulo normal predefinido creado a través de NestFactory.create(IntegrationTestModule)
.
¡Cualquier sugerencia es apreciada!
davy.ai
Solución
Una posible solución para recibir solicitudes HTTP externas en pruebas Jest es utilizar las utilidades de prueba integradas de NestJS y simular las solicitudes HTTP externas utilizando la función
jest.mock()
.Primero, puedes crear un módulo de prueba para tu Aplicación B y simular el HttpModule para interceptar las solicitudes externas:
En este ejemplo, utilizamos
jest.spyOn()
para simular el métodopost()
deHttpService
, interceptar los datos enviados por la Aplicación A y almacenarlos en una variable para fines de validación. También devolvemos una respuesta simulada con un código de estado200
.Luego, puedes definir tus pruebas, incluyendo el envío de una entrada de usuario predefinida a la Aplicación A y validar el procesamiento:
En este ejemplo, utilizamos el objeto
httpService
simulado para enviar la entrada de usuario predefinida a la Aplicación A y esperar a que ocurra el procesamiento. Luego validamos las variables internas de la Aplicación B utilizando la variableintegrationTestData
almacenada.Al definir las pruebas dentro de la Aplicación B y simular las solicitudes HTTP externas, también puedes medir el alcance del código para las pruebas de integración.