Configuración de Jest
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
La filosofía de Jest es funcionar perfectamente por defecto, pero a veces necesitas más poder de configuración.
Se recomienda definir la configuración en un archivo dedicado de JavaScript, TypeScript o JSON. El archivo se detectará automáticamente si se llama jest.config.js|ts|mjs|cjs|cts|json. Puedes usar la bandera --config para pasar una ruta explícita al archivo.
Recuerda que el objeto de configuración resultante siempre debe ser serializable en JSON.
El archivo de configuración simplemente debe exportar un objeto:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
verbose: true,
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
verbose: true,
};
export default config;
O una función que devuelva un objeto:
- JavaScript
- TypeScript
/** @returns {Promise<import('jest').Config>} */
module.exports = async () => {
return {
verbose: true,
};
};
import type {Config} from 'jest';
export default async (): Promise<Config> => {
return {
verbose: true,
};
};
Para leer archivos de configuración TypeScript, Jest requiere por defecto ts-node. Puedes anular este comportamiento agregando un docblock @jest-config-loader al inicio del archivo. Actualmente se admiten ts-node y esbuild-register. Asegúrate de instalar ts-node o el loader que especifiques.
/** @jest-config-loader ts-node */
// or
/** @jest-config-loader esbuild-register */
import type {Config} from 'jest';
const config: Config = {
verbose: true,
};
export default config;
También puedes pasar opciones al loader, por ejemplo para habilitar transpileOnly.
/** @jest-config-loader ts-node */
/** @jest-config-loader-options {"transpileOnly": true} */
import type {Config} from 'jest';
const config: Config = {
verbose: true,
};
export default config;
La configuración también puede almacenarse en un archivo JSON como objeto simple:
{
"bail": 1,
"verbose": true
}
Alternativamente, la configuración de Jest puede definirse mediante la clave "jest" en el package.json de tu proyecto:
{
"name": "my-project",
"jest": {
"verbose": true
}
}
También se puede referenciar el archivo JSON de configuración de Jest mediante la clave "jest" en el package.json de tu proyecto:
{
"name": "my-project",
"jest": "./path/to/config.json"
}
Opciones
Puedes obtener los valores predeterminados de Jest desde jest-config para extenderlos si es necesario:
- JavaScript
- TypeScript
const {defaults} = require('jest-config');
/** @type {import('jest').Config} */
const config = {
moduleDirectories: [...defaults.moduleDirectories, 'bower_components'],
};
module.exports = config;
import type {Config} from 'jest';
import {defaults} from 'jest-config';
const config: Config = {
moduleDirectories: [...defaults.moduleDirectories, 'bower_components'],
};
export default config;
automock[booleano]bail[número | booleano]cacheDirectory[cadena]clearMocks[booleano]collectCoverage[booleano]collectCoverageFrom[array]coverageDirectory[string]coveragePathIgnorePatterns[array<string>]coverageProvider[string]coverageReporters[array<string | [string, options]>]coverageThreshold[object]dependencyExtractor[string]displayName[string, object]errorOnDeprecated[boolean]extensionsToTreatAsEsm[array<string>]fakeTimers[objeto]forceCoverageMatch[array<string>]globals[objeto]globalSetup[string]globalTeardown[string]haste[object]injectGlobals[boolean]maxConcurrency[number]maxWorkers[number | string]moduleDirectories[array<string>]moduleFileExtensions[array<string>]moduleNameMapper[object<string, string | array<string>>]modulePathIgnorePatterns[array<string>]modulePaths[array<string>]notify[boolean]notifyMode[string]openHandlesTimeout[number]preset[string]prettierPath[string]projects[array<string | ProjectConfig>]randomize[boolean]reporters[array<moduleName | [moduleName, options]>]resetMocks[booleano]resetModules[booleano]resolver[cadena]restoreMocks[booleano]rootDir[cadena]roots[arreglo<cadena>]runtime[cadena]runner[cadena]sandboxInjectedGlobals[array<string>]setupFiles[array]setupFilesAfterEnv[array]showSeed[boolean]slowTestThreshold[number]snapshotFormat[objeto]snapshotResolver[cadena]snapshotSerializers[array<string>]testEnvironment[cadena]testEnvironmentOptions[Object]testFailureExitCode[number]testMatch[cadena | array<cadena>]testPathIgnorePatterns[array<string>]testRegex[string | array<string>]testResultsProcessor[string]testRunner[cadena]testSequencer[cadena]testTimeout[número]transform[objeto<string, rutaAlTransformer | [rutaAlTransformer, objeto]>]transformIgnorePatterns[arreglo<string>]unmockedModulePathPatterns[arreglo<string>]verbose[booleano]waitForUnhandledRejections[booleano]watchPathIgnorePatterns[arreglo<string>]watchPlugins[arreglo<string | [string, Objeto]>]watchman[booleano]workerIdleMemoryLimit[número|string]//[cadena]workerThreads
Referencia
automock [booleano]
Valor predeterminado: false
Esta opción indica a Jest que todos los módulos importados en tus pruebas deben ser simulados automáticamente. Todos los módulos usados tendrán una implementación de reemplazo, manteniendo la superficie de la API.
Ejemplo:
export default {
authorize: () => 'token',
isAuthorized: secret => secret === 'wizard',
};
import utils from '../utils';
test('if utils mocked automatically', () => {
// Public methods of `utils` are now mock functions
expect(utils.authorize.mock).toBeTruthy();
expect(utils.isAuthorized.mock).toBeTruthy();
// You can provide them with your own implementation
// or pass the expected return value
utils.authorize.mockReturnValue('mocked_token');
utils.isAuthorized.mockReturnValue(true);
expect(utils.authorize()).toBe('mocked_token');
expect(utils.isAuthorized('not_wizard')).toBeTruthy();
});
Los módulos de Node se simulan automáticamente cuando tienes un mock manual (ej: __mocks__/lodash.js). Más información aquí.
Los módulos core de Node.js, como fs, no se simulan por defecto. Pueden simularse explícitamente con jest.mock('fs').
bail [número | booleano]
Por defecto: 0
Por defecto, Jest ejecuta todas las pruebas y muestra todos los errores en la consola al finalizar. La opción bail permite detener la ejecución después de n fallos. Establecer bail como true equivale a establecerlo en 1.
cacheDirectory [cadena]
Por defecto: "/tmp/<path>"
El directorio donde Jest debe almacenar su información de dependencias en caché.
Jest intenta escanear tu árbol de dependencias una vez (de antemano) y almacenarlo en caché para aliviar parte de la carga en el sistema de archivos que ocurre durante la ejecución de pruebas. Esta opción te permite personalizar dónde Jest guarda esos datos de caché en el disco.
clearMocks [booleano]
Valor predeterminado: false
Borra automáticamente las llamadas, instancias, contextos y resultados de los mocks antes de cada prueba. Equivale a llamar a jest.clearAllMocks() antes de cada prueba. Esto no elimina ninguna implementación de mock que se haya proporcionado.
collectCoverage [booleano]
Valor predeterminado: false
Indica si se debe recopilar información de cobertura durante la ejecución de las pruebas. Como esto adapta todos los archivos ejecutados con declaraciones de recolección de cobertura, puede ralentizar significativamente tus pruebas.
Jest incluye dos proveedores de cobertura: babel (predeterminado) y v8. Consulta la opción coverageProvider para más detalles.
Los proveedores de cobertura babel y v8 usan los comentarios /* istanbul ignore next */ y /* c8 ignore next */ respectivamente para excluir líneas de los informes de cobertura. Para más información, consulta la documentación de istanbuljs y la documentación de c8.
collectCoverageFrom [array]
Por defecto: undefined
Un array de patrones glob que indica qué archivos deben recopilar información de cobertura. Si un archivo coincide con el patrón, se recopilará su cobertura incluso si no tiene pruebas ni se usa en el conjunto de pruebas.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
collectCoverageFrom: [
'**/*.{js,jsx}',
'!**/node_modules/**',
'!**/vendor/**',
],
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
collectCoverageFrom: [
'**/*.{js,jsx}',
'!**/node_modules/**',
'!**/vendor/**',
],
};
export default config;
Esto recopilará cobertura para todos los archivos dentro del rootDir del proyecto, excepto los que coincidan con **/node_modules/** o **/vendor/**.
Cada patrón glob se aplica en el orden especificado en la configuración. Por ejemplo, ["!**/__tests__/**", "**/*.js"] no excluirá __tests__ porque la negación se sobrescribe con el segundo patrón. Para que funcione, el glob negado debe ir después de **/*.js.
Esta opción requiere que collectCoverage esté en true o que Jest se ejecute con --coverage.
Help:
If you are seeing coverage output such as...
=============================== Coverage summary ===============================
Statements : Unknown% ( 0/0 )
Branches : Unknown% ( 0/0 )
Functions : Unknown% ( 0/0 )
Lines : Unknown% ( 0/0 )
================================================================================
Jest: Coverage data for global was not found.
Most likely your glob patterns are not matching any files. Refer to the micromatch documentation to ensure your globs are compatible.
coverageDirectory [string]
Por defecto: undefined
El directorio donde Jest debe guardar sus archivos de cobertura.
coveragePathIgnorePatterns [array<string>]
Predeterminado: ["/node_modules/"]
Un array de patrones regex que se comparan con todas las rutas de archivo antes de ejecutar pruebas. Si la ruta coincide con algún patrón, se omitirá su cobertura.
Estos patrones coinciden con la ruta completa. Usa el token <rootDir> para incluir la ruta del directorio raíz de tu proyecto y evitar que se ignoren accidentalmente archivos en entornos con diferentes directorios raíz. Ejemplo: ["<rootDir>/build/", "<rootDir>/node_modules/"].
coverageProvider [string]
Indica qué proveedor usar para instrumentar el código para cobertura. Valores permitidos: babel (predeterminado) o v8.
coverageReporters [array<string | [string, options]>]
Por defecto: ["clover", "json", "lcov", "text"]
Una lista de nombres de reportadores que Jest utiliza al generar reportes de cobertura. Se puede usar cualquier reportador de istanbul.
Configurar esta opción sobrescribe los valores predeterminados. Agrega "text" o "text-summary" para ver un resumen de cobertura en la salida de la consola.
Se pueden pasar opciones adicionales usando la forma de tupla. Por ejemplo, puedes ocultar las líneas del reporte de cobertura para todos los archivos completamente cubiertos:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
coverageReporters: ['clover', 'json', 'lcov', ['text', {skipFull: true}]],
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
coverageReporters: ['clover', 'json', 'lcov', ['text', {skipFull: true}]],
};
export default config;
Para más información sobre la estructura del objeto de opciones, consulta el tipo CoverageReporterWithOptions en las definiciones de tipo.
coverageThreshold [object]
Por defecto: undefined
Se utiliza para configurar el cumplimiento de umbrales mínimos para los resultados de cobertura. Los umbrales pueden especificarse como global, como un glob, o como ruta de directorio/archivo. Si no se cumplen los umbrales, Jest fallará. Los umbrales especificados como número positivo representan el porcentaje mínimo requerido. Los especificados como número negativo representan la cantidad máxima permitida de entidades no cubiertas.
Por ejemplo, con la siguiente configuración Jest fallará si hay menos del 80% de cobertura en ramas, líneas y funciones, o si hay más de 10 sentencias no cubiertas:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: -10,
},
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: -10,
},
},
};
export default config;
Si se especifican globs o rutas junto con global, los datos de cobertura para las rutas coincidentes se restarán de la cobertura general y los umbrales se aplicarán independientemente. Los umbrales para globs se aplican a todos los archivos que coincidan. Si no se encuentra el archivo especificado por la ruta, se devuelve un error.
Por ejemplo, con esta configuración:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
coverageThreshold: {
global: {
branches: 50,
functions: 50,
lines: 50,
statements: 50,
},
'./src/components/': {
branches: 40,
statements: 40,
},
'./src/reducers/**/*.js': {
statements: 90,
},
'./src/api/very-important-module.js': {
branches: 100,
functions: 100,
lines: 100,
statements: 100,
},
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
coverageThreshold: {
global: {
branches: 50,
functions: 50,
lines: 50,
statements: 50,
},
'./src/components/': {
branches: 40,
statements: 40,
},
'./src/reducers/**/*.js': {
statements: 90,
},
'./src/api/very-important-module.js': {
branches: 100,
functions: 100,
lines: 100,
statements: 100,
},
},
};
export default config;
Jest fallará si:
-
El directorio
./src/componentstiene menos del 40% de cobertura en ramas o sentencias. -
Algún archivo que coincida con el glob
./src/reducers/**/*.jstiene menos del 90% de cobertura de sentencias. -
El archivo
./src/api/very-important-module.jstiene menos del 100% de cobertura. -
El resto de archivos combinados tienen menos del 50% de cobertura (
global).
dependencyExtractor [string]
Por defecto: undefined
Esta opción permite usar un extractor de dependencias personalizado. Debe ser un módulo de node que exporte un objeto con una función extract. Ejemplo:
const crypto = require('crypto');
const fs = require('fs');
module.exports = {
extract(code, filePath, defaultExtract) {
const deps = defaultExtract(code, filePath);
// Scan the file and add dependencies in `deps` (which is a `Set`)
return deps;
},
getCacheKey() {
return crypto
.createHash('md5')
.update(fs.readFileSync(__filename))
.digest('hex');
},
};
La función extract debe devolver un iterable (Array, Set, etc.) con las dependencias encontradas en el código.
Ese módulo también puede contener una función getCacheKey para generar una clave de caché que determine si la lógica ha cambiado y si se deben descartar artefactos en caché que dependan de ella.
displayName [string, object]
predeterminado: undefined
Permite mostrar una etiqueta junto a una prueba mientras se ejecuta. Esto es especialmente útil en repositorios multi-proyecto con múltiples archivos de configuración de Jest, ya que indica visualmente a qué proyecto pertenece cada prueba.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
displayName: 'CLIENT',
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
displayName: 'CLIENT',
};
export default config;
Alternativamente, se puede pasar un objeto con las propiedades name y color. Esto permite configurar personalizadamente el color de fondo del displayName. Cuando es string, displayName usa blanco por defecto. Jest usa chalk para los colores, por lo que todas las opciones válidas de colores en chalk son compatibles.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
displayName: {
name: 'CLIENT',
color: 'blue',
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
displayName: {
name: 'CLIENT',
color: 'blue',
},
};
export default config;
errorOnDeprecated [boolean]
Valor predeterminado: false
Hace que llamar a APIs obsoletas genere mensajes de error útiles. Facilita el proceso de actualización.
extensionsToTreatAsEsm [array<string>]
Por defecto: []
Jest ejecutará archivos .mjs y .js cuyo package.json más cercano tenga el campo type configurado como module como Módulos ECMAScript. Si tienes otros archivos que deben ejecutarse con ESM nativo, debes especificar su extensión aquí.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
extensionsToTreatAsEsm: ['.ts'],
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
extensionsToTreatAsEsm: ['.ts'],
};
export default config;
El soporte de ESM en Jest aún es experimental; consulta su documentación para más detalles.
fakeTimers [objeto]
Valor predeterminado: {}
Los temporizadores simulados pueden ser útiles cuando un fragmento de código establece un tiempo de espera largo que no queremos esperar en una prueba. Para detalles adicionales, consulta la guía de temporizadores simulados y la documentación de la API.
Esta opción proporciona la configuración predeterminada de temporizadores simulados para todas las pruebas. Llamar a jest.useFakeTimers() en un archivo de prueba usará estas opciones o las sobrescribirá si se pasa un objeto de configuración. Por ejemplo, puedes indicar a Jest que mantenga la implementación original de process.nextTick() y ajustar el límite de temporizadores recursivos que se ejecutarán:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
fakeTimers: {
doNotFake: ['nextTick'],
timerLimit: 1000,
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
fakeTimers: {
doNotFake: ['nextTick'],
timerLimit: 1000,
},
};
export default config;
// install fake timers for this file using the options from Jest configuration
jest.useFakeTimers();
test('increase the limit of recursive timers for this and following tests', () => {
jest.useFakeTimers({timerLimit: 5000});
// ...
});
En lugar de incluir jest.useFakeTimers() en cada archivo de prueba, puedes habilitar temporizadores simulados globalmente en tu configuración de Jest:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
fakeTimers: {
enableGlobally: true,
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
fakeTimers: {
enableGlobally: true,
},
};
export default config;
Opciones de configuración:
type FakeableAPI =
| 'Date'
| 'hrtime'
| 'nextTick'
| 'performance'
| 'queueMicrotask'
| 'requestAnimationFrame'
| 'cancelAnimationFrame'
| 'requestIdleCallback'
| 'cancelIdleCallback'
| 'setImmediate'
| 'clearImmediate'
| 'setInterval'
| 'clearInterval'
| 'setTimeout'
| 'clearTimeout';
type ModernFakeTimersConfig = {
/**
* If set to `true` all timers will be advanced automatically by 20 milliseconds
* every 20 milliseconds. A custom time delta may be provided by passing a number.
* The default is `false`.
*/
advanceTimers?: boolean | number;
/**
* List of names of APIs that should not be faked. The default is `[]`, meaning
* all APIs are faked.
*/
doNotFake?: Array<FakeableAPI>;
/** Whether fake timers should be enabled for all test files. The default is `false`. */
enableGlobally?: boolean;
/**
* Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`.
* The default is `false`.
*/
legacyFakeTimers?: boolean;
/** Sets current system time to be used by fake timers, in milliseconds. The default is `Date.now()`. */
now?: number;
/** Maximum number of recursive timers that will be run. The default is `100_000` timers. */
timerLimit?: number;
};
Si por algún motivo necesitas usar la implementación heredada de temporizadores simulados, así se habilita globalmente (no se admiten opciones adicionales):
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
fakeTimers: {
enableGlobally: true,
legacyFakeTimers: true,
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
fakeTimers: {
enableGlobally: true,
legacyFakeTimers: true,
},
};
export default config;
forceCoverageMatch [array<string>]
Valor predeterminado: ['']
Normalmente, los archivos de prueba se ignoran al recopilar la cobertura de código. Con esta opción, puedes sobrescribir este comportamiento e incluir archivos que normalmente se ignorarían.
Por ejemplo, si tienes pruebas en archivos fuente con extensión .t.js como:
export function sum(a, b) {
return a + b;
}
if (process.env.NODE_ENV === 'test') {
test('sum', () => {
expect(sum(1, 2)).toBe(3);
});
}
Puedes recopilar cobertura de esos archivos configurando forceCoverageMatch.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
forceCoverageMatch: ['**/*.t.js'],
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
forceCoverageMatch: ['**/*.t.js'],
};
export default config;
globals [objeto]
Valor predeterminado: {}
Conjunto de variables globales que deben estar disponibles en todos los entornos de prueba.
Por ejemplo, lo siguiente crearía una variable global __DEV__ establecida como true en todos los entornos:
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
globals: {
__DEV__: true,
},
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
globals: {
__DEV__: true,
},
};
export default config;
Si especificas aquí un valor de referencia global (como un objeto o array) y algún código modifica ese valor durante una prueba, esa modificación no persistirá entre ejecuciones para otros archivos de prueba. Además, el objeto globals debe ser serializable en JSON, por lo que no puede usarse para especificar funciones globales. Para eso, usa setupFiles.
globalSetup [string]
Por defecto: undefined
Esta opción permite utilizar un módulo personalizado de configuración global, que debe exportar una función (puede ser síncrona o asíncrona). La función se ejecutará una vez antes de todos los conjuntos de pruebas y recibirá dos argumentos: la globalConfig de Jest y la projectConfig.
Un módulo de configuración global configurado en un proyecto (usando el ejecutor multiproyecto) se activará solo cuando ejecutes al menos una prueba de ese proyecto.
Las variables globales definidas mediante globalSetup solo pueden leerse en globalTeardown. No puedes acceder a las variables globales definidas aquí en tus conjuntos de pruebas.
Aunque se aplica transformación de código al archivo de configuración vinculado, Jest no transformará ningún código en node_modules. Esto se debe a la necesidad de cargar los transformadores reales (ej. babel o typescript) para realizar la transformación.
module.exports = async function (globalConfig, projectConfig) {
console.log(globalConfig.testPathPatterns);
console.log(projectConfig.cache);
// Set reference to mongod in order to close the server during teardown.
globalThis.__MONGOD__ = mongod;
};
module.exports = async function (globalConfig, projectConfig) {
console.log(globalConfig.testPathPatterns);
console.log(projectConfig.cache);
await globalThis.__MONGOD__.stop();
};
globalTeardown [string]
Por defecto: undefined
Esta opción permite utilizar un módulo personalizado de desmontaje global que debe exportar una función (puede ser síncrona o asíncrona). La función se ejecutará una vez después de todos los conjuntos de pruebas y recibirá dos argumentos: la globalConfig de Jest y la projectConfig.
Un módulo de desmontaje global configurado en un proyecto (usando el ejecutor multiproyecto) se activará solo cuando ejecutes al menos una prueba de ese proyecto.
La misma advertencia sobre la transformación de node_modules que aplica a globalSetup también se aplica a globalTeardown.
haste [object]
Por defecto: undefined
Esto se utilizará para configurar el comportamiento de jest-haste-map, el sistema interno de rastreo/caché de archivos de Jest. Se admiten las siguientes opciones:
type HasteConfig = {
/** Whether to hash files using SHA-1. */
computeSha1?: boolean;
/** The platform to use as the default, e.g. 'ios'. */
defaultPlatform?: string | null;
/** Force use of Node's `fs` APIs rather than shelling out to `find` */
forceNodeFilesystemAPI?: boolean;
/**
* Whether to follow symlinks when crawling for files.
* This options cannot be used in projects which use watchman.
* Projects with `watchman` set to true will error if this option is set to true.
*/
enableSymlinks?: boolean;
/** Path to a custom implementation of Haste. */
hasteImplModulePath?: string;
/** All platforms to target, e.g ['ios', 'android']. */
platforms?: Array<string>;
/** Whether to throw an error on module collision. */
throwOnModuleCollision?: boolean;
/** Custom HasteMap module */
hasteMapModulePath?: string;
/** Whether to retain all files, allowing e.g. search for tests in `node_modules`. */
retainAllFiles?: boolean;
};