Uso con webpack
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Jest puede usarse en proyectos que utilizan webpack para gestionar recursos, estilos y compilación. webpack sí presenta desafíos únicos frente a otras herramientas porque se integra directamente con tu aplicación para permitir gestionar hojas de estilo, recursos como imágenes y fuentes, junto con el extenso ecosistema de lenguajes y herramientas que compilan a JavaScript.
Un ejemplo con webpack
Comencemos con un archivo de configuración típico de webpack y adaptémoslo para Jest.
module.exports = {
module: {
rules: [
{
test: /\.jsx?$/,
exclude: ['node_modules'],
use: ['babel-loader'],
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.gif$/,
type: 'asset/inline',
},
{
test: /\.(ttf|eot|svg)$/,
type: 'asset/resource',
},
],
},
resolve: {
alias: {
config$: './configs/app-config.js',
react: './vendor/react-master',
},
extensions: ['.js', '.jsx'],
modules: [
'node_modules',
'bower_components',
'shared',
'/shared/vendor/modules',
],
},
};
Si tienes archivos JavaScript transformados por Babel, puedes activar el soporte para Babel instalando el plugin babel-jest. Las transformaciones JavaScript que no sean de Babel pueden manejarse con la opción transform de Jest.
Manejo de recursos estáticos
Ahora configuremos Jest para manejar correctamente archivos de recursos como hojas de estilo e imágenes. Normalmente, estos archivos no son particularmente útiles en pruebas, así que podemos simularlos sin problemas. Sin embargo, si usas CSS Modules, es mejor simular un proxy para las búsquedas de className.
module.exports = {
moduleNameMapper: {
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'<rootDir>/__mocks__/fileMock.js',
'\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js',
},
};
Y los propios archivos simulados:
module.exports = {};
module.exports = 'test-file-stub';
Simulación de CSS Modules
Puedes usar un Proxy de ES6 para simular CSS Modules:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev identity-obj-proxy
yarn add --dev identity-obj-proxy
pnpm add --save-dev identity-obj-proxy
bun add --dev identity-obj-proxy
Entonces todas tus búsquedas de className en el objeto de estilos devolverán el valor literal (ej. styles.foobar === 'foobar'). Esto es bastante útil para Pruebas de Instantáneas en React.
module.exports = {
moduleNameMapper: {
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'<rootDir>/__mocks__/fileMock.js',
'\\.(css|less)$': 'identity-obj-proxy',
},
};
Si moduleNameMapper no satisface tus necesidades, puedes usar la opción transform de Jest para especificar cómo se transforman los recursos. Por ejemplo, un transformador que devuelve el nombre base de un archivo (de modo que require('logo.jpg'); devuelva 'logo') podría escribirse así:
const path = require('path');
module.exports = {
process(sourceText, sourcePath, options) {
return {
code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`,
};
},
};
module.exports = {
moduleNameMapper: {
'\\.(css|less)$': 'identity-obj-proxy',
},
transform: {
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'<rootDir>/fileTransformer.js',
},
};
Hemos indicado a Jest que ignore archivos con extensiones de hojas de estilo o imágenes, y en su lugar, utilice nuestros archivos simulados. Puedes ajustar la expresión regular para que coincida con los tipos de archivo que maneja tu configuración de webpack.
Recuerda incluir explícitamente el transformador predeterminado babel-jest si deseas usarlo junto con otros preprocesadores de código:
"transform": {
"\\.[jt]sx?$": "babel-jest",
"\\.css$": "some-css-transformer",
}
Configurar Jest para encontrar nuestros archivos
Ahora que Jest sabe cómo procesar nuestros archivos, debemos indicarle cómo encontrarlos. Para las opciones modules y extensions de webpack, existen equivalentes directos en las opciones moduleDirectories y moduleFileExtensions de Jest.
module.exports = {
moduleFileExtensions: ['js', 'jsx'],
moduleDirectories: ['node_modules', 'bower_components', 'shared'],
moduleNameMapper: {
'\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js',
'\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.js',
},
};
<rootDir> es un token especial que Jest reemplaza por la raíz de tu proyecto. Normalmente será la carpeta donde se encuentra tu package.json, a menos que especifiques una opción personalizada rootDir en tu configuración.
De manera similar, la contraparte en Jest para resolve.roots de Webpack (alternativa a establecer NODE_PATH) es modulePaths.
module.exports = {
modulePaths: ['/shared/vendor/modules'],
moduleFileExtensions: ['js', 'jsx'],
moduleDirectories: ['node_modules', 'bower_components', 'shared'],
moduleNameMapper: {
'\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js',
'\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.js',
},
};
Finalmente, debemos manejar los alias de webpack. Para eso, podemos usar nuevamente la opción moduleNameMapper.
module.exports = {
modulePaths: ['/shared/vendor/modules'],
moduleFileExtensions: ['js', 'jsx'],
moduleDirectories: ['node_modules', 'bower_components', 'shared'],
moduleNameMapper: {
'\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js',
'\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.js',
'^react(.*)$': '<rootDir>/vendor/react-master$1',
'^config$': '<rootDir>/configs/app-config.js',
},
};
¡Eso es todo! webpack es una herramienta compleja y flexible, así que quizás necesites ajustes para cubrir las necesidades específicas de tu aplicación. Afortunadamente, para la mayoría de proyectos Jest es lo suficientemente flexible para manejar tu configuración de webpack.
Para configuraciones más complejas de webpack, también podrías investigar proyectos como: babel-plugin-webpack-loaders.
Uso con webpack
Además de instalar babel-jest como se mencionó anteriormente, deberás agregar @babel/preset-env así:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/preset-env
yarn add --dev @babel/preset-env
pnpm add --save-dev @babel/preset-env
bun add --dev @babel/preset-env
Luego, querrás configurar Babel de la siguiente manera:
{
"presets": ["@babel/preset-env"]
}
Jest almacena archivos en caché para acelerar la ejecución de pruebas. Si actualizaste .babelrc y Jest no funciona como esperabas, intenta borrar la caché ejecutando jest --clearCache.
Si usas importaciones dinámicas (import('some-file.js').then(module => ...)), necesitas habilitar el plugin dynamic-import-node.
{
"presets": [["env", {"modules": false}]],
"plugins": ["syntax-dynamic-import"],
"env": {
"test": {
"plugins": ["dynamic-import-node"]
}
}
}
Para ver un ejemplo de cómo usar Jest con webpack en React, puedes consultar uno aquí.