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

EnvironmentUse CaseConfig
nodeAPIs, CLIs, server codetestEnvironment: 'node'
jsdomReact/DOM componentstestEnvironment: 'jsdom'
jest-environment-jsdomJest 27+ explicit jsdomtestEnvironment: 'jest-environment-jsdom'
CustomElectron, WorkerstestEnvironment: './myEnv.js'
// Per-file override via docblock /** * @jest-environment jsdom */ import { render } from '@testing-library/react'; // ... component tests