Jest Config Guide
Basic jest.config.js
A minimal yet complete Jest configuration for a modern JS/TS project:
// jest.config.js
/** @type {import('jest').Config} */
const config = {
testEnvironment: 'node', // or 'jsdom' for browser-like
roots: ['<rootDir>/src'],
testMatch: ['**/__tests__/**/*.ts', '**/*.spec.ts', '**/*.test.ts'],
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
collectCoverageFrom: ['src/**/*.{ts,tsx}', '!src/**/*.d.ts'],
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
};
module.exports = config;
moduleNameMapper โ Path Aliases & Stubs
Map module paths and stub out non-JS assets:
// jest.config.js
module.exports = {
moduleNameMapper: {
// TypeScript/Webpack path aliases
'^@/(.*)$': '<rootDir>/src/$1',
'^@components/(.*)$': '<rootDir>/src/components/$1',
// Stub CSS / image imports
'\\.css$': '<rootDir>/__mocks__/styleMock.js',
'\\.(jpg|jpeg|png|gif|svg|webp)$': '<rootDir>/__mocks__/fileMock.js',
// Stub WASM or binary files
'\\.wasm$': '<rootDir>/__mocks__/wasmMock.js',
},
};
// __mocks__/styleMock.js
module.exports = {};
// __mocks__/fileMock.js
module.exports = 'test-file-stub';
transform โ Compiling Source Files
// jest.config.js โ using babel-jest (default for .js/.jsx)
module.exports = {
transform: {
'^.+\\.[jt]sx?$': 'babel-jest',
'^.+\\.tsx?$': ['ts-jest', { tsconfig: 'tsconfig.test.json' }],
'^.+\\.svg$': '<rootDir>/svgTransform.js',
},
transformIgnorePatterns: [
'/node_modules/(?!(some-esm-pkg|another-pkg)/)',
],
};
// babel.config.js for Jest
module.exports = {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }],
'@babel/preset-typescript',
['@babel/preset-react', { runtime: 'automatic' }],
],
};
setupFiles & setupFilesAfterFramework
// jest.config.js
module.exports = {
// Runs before test framework is installed โ good for env vars
setupFiles: ['<rootDir>/jest.env.js'],
// Runs after framework โ good for jest-dom, custom matchers
setupFilesAfterFramework: ['<rootDir>/jest.setup.ts'],
};
// jest.env.js
process.env.NODE_ENV = 'test';
process.env.API_URL = 'http://localhost:3000';
// jest.setup.ts
import '@testing-library/jest-dom';
import { server } from './src/mocks/server';
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
Coverage Configuration
// jest.config.js
module.exports = {
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.{js,ts,jsx,tsx}',
'!src/**/*.d.ts',
'!src/**/index.ts', // re-exports only
'!src/**/*.stories.tsx',
],
coverageDirectory: '<rootDir>/coverage',
coverageReporters: ['text', 'text-summary', 'lcov', 'html', 'json'],
coverageThresholds: {
global: {
branches: 80,
functions: 85,
lines: 85,
statements: 85,
},
// Per-file threshold
'./src/utils/critical.ts': {
branches: 100,
functions: 100,
lines: 100,
statements: 100,
},
},
};
testEnvironment Options
| Environment | Use Case | Config |
|---|---|---|
node | APIs, CLIs, server code | testEnvironment: 'node' |
jsdom | React/DOM components | testEnvironment: 'jsdom' |
jest-environment-jsdom | Jest 27+ explicit jsdom | testEnvironment: 'jest-environment-jsdom' |
| Custom | Electron, Workers | testEnvironment: './myEnv.js' |
// Per-file override via docblock
/**
* @jest-environment jsdom
*/
import { render } from '@testing-library/react';
// ... component tests