Búsqueda de sitios web

pruebas - ¿Por qué Jest está ejecutando mi prueba de TypeScript dos veces y siempre falla una vez?


Estoy escribiendo una prueba en mi backend para probar una ruta simple de mi API. Estoy usando Typescript y Jest para escribir la prueba y todo está ocurriendo dentro de un contenedor de Docker que inicio usando docker-compose.

Tengo una clase de ayuda para mis pruebas, que crea una instancia de un servidor web express y una conexión a la base de datos a través de la función init. En la función shutdown cierra la conexión, etc. Así que mi prueba se ve así:

import { Helper } from "./helper";
import request from 'supertest'

describe('article', () => {
    const helper = new Helper();
    beforeAll(async () => {
        await helper.init();
    });

    afterAll(async () => {
        await helper.shutdown();
    });

    it('should test if reaching the api is possible', async (done) => {
        request(helper.app)
        .get('/test')
        .send()
        .set('Accept', 'application/json')
        .expect(200)
        .end( (error, response) => {
            if(error) throw error;
            expect(response.body.message).toBe("Hello");
        });
    });

Para ejecutar la prueba, utilizo este script "test": "jest --verbose --forceExit --runInBand --detectOpenHandles"

Si ejecuto la prueba así, obtengo el siguiente resultado:

Cambié el Tiempo de Espera como se propuso, pero no hizo ninguna diferencia. Ahora, con fines de prueba, hice que mi ruta devolviera "Helloo" en lugar del esperado "Hello". Este es el resultado que recibo:

Así que obviamente obtiene una respuesta. Mi pregunta es, ¿por qué se ejecuta la prueba dos veces y por qué siempre se agota el tiempo en la segunda prueba?

Este es mi jest.config.js

module.exports = {
    "roots": [
      "<rootDir>/src"
    ],
    "transform": {
      "^.+\\.tsx?$": "ts-jest"
    },
    "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
    "moduleFileExtensions": [
      "ts",
      "js"
    ],
  }

Respuesta #1

Solución

Dado que esta pregunta está recibiendo algo de atención recientemente, removí la solución del texto de la pregunta y la agregué a esta respuesta. No estoy seguro si este es/fue el enfoque correcto y si hice algo redundante, ya que usé jest por segunda vez y no lo he vuelto a tocar desde entonces. Pero en el momento en que publiqué la pregunta, esto resolvió mi problema:

Tuve que rodear las expectativas con un bloque try-catch, no marques la prueba como async, pero pasa la función done y llama a la función done después de las expectativas y también en el bloque catch.

Respuesta #2

Al usar pruebas asincrónicas, podrías llamar al callback done desde el cuerpo de tu manejador asincrónico.

algo así debería servir:

it('should test if reaching the api is possible', (done) => { // << async tests have the done callback declared here
        request(helper.app)
        .get('/test')
        .send()
        .set('Accept', 'application/json')
        .expect(200)
        .end( (error, response) => {
            if(error) {
              done(error);
            } else {
              expect(response.body.message).toBe("Hello");
              done();
            }
        });
    });

Artículos relacionados