Búsqueda de sitios web

javascript - Mensaje "La devolución de llamada asíncrona no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout"


Estoy usando Puppeteer y Jest para ejecutar algunas pruebas de front-end.

Mis pruebas se ven de la siguiente manera:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async () => {
      await page.waitForSelector(PROFILE.TAB);
      await page.click(PROFILE.TAB);
    }, 30000);
});

A veces, cuando ejecuto las pruebas, todo funciona como se esperaba. Otras veces, obtengo un error:

Tiempo de espera: la llamada asincrónica no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout.

     at node_modules/jest-jasmine2/build/queue_runner.js:68:21 <br/>
     at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)

Esto es extraño porque:

  1. Especifiqué que el tiempo de espera fuera de 30000

  2. Si obtengo o no este error parece ser muy aleatorio

¿Por qué está pasando esto?

Respuesta #1

El tiempo de espera que especifique aquí debe ser más corto que el tiempo de espera predeterminado.

El tiempo de espera predeterminado es 5000 y el marco por defecto es jasmine en caso de jest. Puedes especificar el tiempo de espera dentro de la prueba agregando

jest.setTimeout(30000);

Pero esto sería específico para la prueba. O puedes configurar el archivo de configuración para el marco.

Configurando Jest

// jest.config.js
module.exports = {
  // setupTestFrameworkScriptFile has been deprecated in
  // favor of setupFilesAfterEnv in jest 24
  setupFilesAfterEnv: ['./jest.setup.js']
}

// jest.setup.js
jest.setTimeout(30000)

Ver también estos hilos:

setTimeout para prueba #5055

Hacer que jasmine.DEFAULT_TIMEOUT_INTERVAL sea configurable #652

P.D.: La falta de ortografía setupFilesAfterEnv (es decir, setupFileAfterEnv) también generará el mismo error.

Respuesta #2

Debería llamar al async/await cuando sea asincrónico desde la prueba.

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async (done) => {
        await page.waitForSelector(PROFILE.TAB);
        await page.click(PROFILE.TAB);
        done();
    }, 30000);
});

Respuesta #3

La respuesta a esta pregunta ha cambiado a medida que Jest ha evolucionado. Respuesta actual (marzo de 2019):

  1. Puedes anular el tiempo de espera de cualquier prueba individual añadiendo un tercer parámetro a it. Es decir, it('runs slow',() => {...}, 9999)

  2. Puedes cambiar el valor predeterminado usando jest.setTimeout. Para hacer esto:

    // Configuration
    "setupFilesAfterEnv": [  // NOT setupFiles
        "./src/jest/defaultTimeout.js"
    ],
    

    y

    // File: src/jest/defaultTimeout.js
    /* Global jest */
    jest.setTimeout(1000)
    
  3. Como otros han señalado, y no está directamente relacionado con esto, done no es necesario con el enfoque async/await.

Respuesta #4

Esta es una actualización relativamente nueva, pero es mucho más sencilla. Si estás usando Jest 24.9.0 o superior, puedes simplemente agregar testTimeout a tu configuración:

// in jest.config.js
module.exports = {
  testTimeout: 30000
}

Respuesta #5

Para Jest 24.9+, solo necesitamos agregar --testTimeout en la línea de comandos:

--testTimeout= 10000 // Timeout of 10 seconds

El valor de tiempo de espera predeterminado es 5000 (5000 ms - 5 segundos). Esto será aplicable para todos los casos de prueba.

O si solo quieres dar un tiempo de espera a una función en particular, entonces puedes usar esta sintaxis al declarar el caso de prueba.

test(name, fn, timeout)

Ejemplo

test('example', async () => {

}, 10000); // Timeout of 10 seconds (default is 5000 ms)

Respuesta #6

Me gustaría añadir (esto es un poco largo para un comentario) que incluso con un tiempo de espera de 3000 mis pruebas todavía a veces (aleatoriamente) fallarían con

Tiempo de espera: la llamada asincrónica no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout.

Gracias a la gran respuesta de Tarun, creo que la forma más corta de arreglar muchas pruebas es:

describe('Puppeteer tests', () => {
  beforeEach(() => {
    jest.setTimeout(10000);
  });

  test('Best Jest test fest', async () => {
    // Blah
  });
});

Respuesta #7

Para Jest 24.9+, también puedes configurar el tiempo de espera desde la línea de comandos agregando --testTimeout.

Aquí hay un extracto de su documentación:

--testTimeout=<número>
Tiempo de espera predeterminado de una prueba en milisegundos. Valor predeterminado: 5000.

Respuesta #8

Asegúrate de invocar done(); en los callbacks o simplemente no pasará la prueba.

beforeAll((done /* Call it or remove it */ ) => {
  done(); // Calling it
});

Se aplica a todas las demás funciones que tienen un callback done().

Respuesta #9

Otra solución más: establece el tiempo de espera en el archivo de configuración de Jest, por ejemplo:

{ // ... other stuff here
    "testTimeout": 90000
}

Artículos relacionados