es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    import { Test } from '@nestjs/testing';
    import { HttpModule, HttpService } from '@nestjs/common';
    import { of } from 'rxjs';
    
    describe('Prueba de integración', () => {
      let httpService: HttpService;
    
      beforeAll(async () => {
        const testingModule = await Test.createTestingModule({
          imports: [HttpModule],
          providers: [IntegrationTestService],
          controllers: [IntegrationTestController],
        }).compile();
    
        httpService = testingModule.get(HttpService);
    
        jest.spyOn(httpService, 'post').mockImplementation((url, data) => {
          // Almacenar los datos recibidos en una variable para fines de validación
          integrationTestData = data;
          // Devolver una respuesta simulada
          return of({ status: 200, data: { message: 'Respuesta simulada' } });
        });
      });
    
      afterAll(() => {
        jest.restoreAllMocks();
      });
    
      // Aquí puedes definir tus pruebas...
    });
    

    En este ejemplo, utilizamos jest.spyOn() para simular el método post() de HttpService, 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 estado 200.

    Luego, puedes definir tus pruebas, incluyendo el envío de una entrada de usuario predefinida a la Aplicación A y validar el procesamiento:

    it('debería validar las variables internas con la entrada de usuario', async () => {
      const entradaUsuario = { /* Define tu entrada de usuario aquí */ };
    
      // Enviar la entrada de usuario predefinida a la Aplicación A utilizando el cliente HttpService
      const respuesta = await httpService.post('http://applicationA.com', entradaUsuario).toPromise();
      expect(respuesta.status).toBe(200);
    
      // Esperar algún procesamiento (por ejemplo, una solicitud HTTP de la Aplicación A a la Aplicación B)
      // y validar las variables internas de la Aplicación B
      // utilizando la variable `integrationTestData` almacenada
      expect(integrationTestData).toEqual({ /* Define tus variables internas esperadas aquí */ });
    });
    

    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 variable integrationTestData 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.

Comments are closed.