Saltar al contenido principal
Versión: 29.7

Solución de problemas

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

¿Algo salió mal? Usa esta guía para resolver problemas con Jest.

Las pruebas fallan y no sabes por qué

Prueba usando el soporte de depuración incorporado en Node. Coloca una sentencia debugger; en tus pruebas y luego, en el directorio de tu proyecto, ejecuta:

node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

Esto ejecutará Jest en un proceso Node al que se puede conectar un depurador externo. Ten en cuenta que el proceso se pausará hasta que el depurador se conecte.

Para depurar en Google Chrome (o cualquier navegador basado en Chromium), abre tu navegador, ingresa a chrome://inspect y haz clic en "Open Dedicated DevTools for Node". Esto mostrará una lista de instancias Node disponibles. Haz clic en la dirección mostrada en la terminal (normalmente algo como localhost:9229) después de ejecutar el comando anterior, y podrás depurar Jest usando las DevTools de Chrome.

Se mostrarán las Chrome Developer Tools con un punto de interrupción en la primera línea del script CLI de Jest (esto da tiempo para abrir las herramientas y evita que Jest ejecute antes de tiempo). Haz clic en el botón de "reproducir" en la esquina superior derecha para continuar. Cuando Jest ejecute la prueba con debugger, la ejecución se pausará y podrás examinar el alcance actual y la pila de llamadas.

nota

La opción CLI --runInBand asegura que Jest ejecute las pruebas en el mismo proceso en lugar de crear procesos individuales. Normalmente Jest paraleliza las pruebas, pero depurar múltiples procesos simultáneamente es difícil.

Depuración en VS Code

Existen varias formas de depurar pruebas de Jest con el depurador integrado de Visual Studio Code.

Para conectar el depurador integrado, ejecuta tus pruebas como antes:

node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

Luego conecta el depurador de VS Code usando esta configuración en launch.json:

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}

Para iniciar y conectar automáticamente a un proceso ejecutando tus pruebas, usa:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

O para Windows:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

Si usas create-react-app de Facebook, depura tus pruebas de Jest con:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": [
"test",
"--runInBand",
"--no-cache",
"--env=jsdom",
"--watchAll=false"
],
"cwd": "${workspaceRoot}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

Más información sobre depuración en Node aquí.

Depuración en WebStorm

WebStorm tiene soporte integrado para Jest. Lee Testing With Jest in WebStorm para más detalles.

Problemas de caché

¿Cambiaste el script de transformación o actualizaste Babel, pero Jest no reconoce los cambios?

Reintenta con --no-cache. Jest almacena en caché archivos de módulos transformados para acelerar las pruebas. Si usas un transformer personalizado, considera añadir una función getCacheKey: ejemplo en Relay.

Promesas no resueltas

Si una promesa nunca se resuelve, puede aparecer este error:

- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Normalmente se debe a implementaciones conflictivas de Promises. Considera reemplazar la implementación global con la tuya, por ejemplo globalThis.Promise = jest.requireActual('promise'); y/o unifica las librerías de Promises usadas.

Si tu prueba tarda mucho en ejecutarse, considera aumentar el timeout con jest.setTimeout.

jest.setTimeout(10_000); // 10 second timeout

Problemas con Watchman

Prueba ejecutar Jest con --no-watchman o configura la opción watchman a false en tu configuración.

También consulta la guía de solución de problemas de Watchman.

Los tests son extremadamente lentos en Docker y/o servidores de CI

Aunque Jest suele ser muy rápido en equipos modernos con múltiples núcleos y SSD rápidos, puede ser lento en ciertas configuraciones como han descubierto nuestros usuarios.

Según los hallazgos, una forma de mitigar este problema y mejorar la velocidad hasta en un 50% es ejecutar los tests secuencialmente.

Para hacer esto, puedes ejecutar tests en el mismo hilo usando --runInBand:

# Using Jest CLI
jest --runInBand

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --runInBand

Otra alternativa para acelerar los tests en servidores de CI como Travis-CI es configurar el grupo máximo de workers a ~4. Específicamente en Travis-CI, esto puede reducir el tiempo de ejecución a la mitad. Nota: El plan gratuito de Travis CI para proyectos open source solo incluye 2 núcleos de CPU.

# Using Jest CLI
jest --maxWorkers=4

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --maxWorkers=4

Si usas GitHub Actions, puedes emplear github-actions-cpu-cores para detectar el número de CPUs y pasárselo a Jest.

- name: Get number of CPU cores
id: cpu-cores
uses: SimenB/github-actions-cpu-cores@v2
- name: run tests
run: yarn jest --max-workers ${{ steps.cpu-cores.outputs.count }}

Otra opción es usar la opción shard para paralelizar la ejecución de tests en múltiples máquinas.

coveragePathIgnorePatterns parece no tener efecto

Asegúrate de no estar usando el plugin babel-plugin-istanbul. Jest encapsula Istanbul y le indica qué archivos instrumentar para la recolección de cobertura. Al usar babel-plugin-istanbul, cada archivo procesado por Babel tendrá código de recolección de cobertura, por lo que coveragePathIgnorePatterns no los ignorará.

Definición de tests

Los tests deben definirse de forma síncrona para que Jest pueda recolectarlos correctamente.

Como ejemplo que ilustra por qué esto es necesario, imagina que escribimos un test así:

// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);

Cuando Jest ejecute tus tests para recolectar los tests, no encontrará ninguno porque hemos configurado la definición para ocurrir asíncronamente en el siguiente ciclo del event loop. Esto significa que al usar test.each no puedes establecer la tabla de forma asíncrona dentro de un beforeEach / beforeAll.

¿Sigues con problemas?

Consulta nuestra sección de Ayuda.