5月28日 05:27

如何配置 Jest?常用配置选项有哪些?

Jest 有三种配置方式:package.jsonjest 字段、独立的 jest.config.js(或 .ts/.json/.mjs)文件、以及 CLI 参数 --config。实际项目中 90% 用 jest.config.js,因为可读性好、能写注释、支持条件逻辑。

核心配置项按优先级说:

testEnvironment — 决定测试运行环境。node 适合纯逻辑(工具函数、后端),jsdom 模拟浏览器 DOM(React 组件、DOM 操作)。选错会导致全局对象找不到或内存飙升。Next.js 项目用 @jest/globals 里的 customExportConditions 可以按组件区分环境。

transform — 告诉 Jest 用什么转换器处理非 JS 文件。babel-jest 是默认值,TypeScript 项目换成 ts-jest 或用 @swc/jest 加速。配错了表现为 SyntaxError: Unexpected token

moduleNameMapper — 路径别名映射。配 Webpack/Vite 的 @/ 前缀、CSS/图片等静态资源的 mock 都靠它。最常见写法:'^@/(.*)$': '<rootDir>/src/$1',静态资源用 identity-obj-proxy

transformIgnorePatterns — 指定哪些文件不做转换。默认忽略整个 node_modules,但 ESM 包(如 lodash-esaxios)没编译成 CJS 就会报错。解法是用负向先行断言:'/node_modules/(?!(lodash-es|axios)/)'

setupFilesAfterEnv — 测试环境初始化后执行的脚本,用来引入 @testing-library/jest-dom 的扩展匹配器、全局 mock window.matchMedia 等。区别于 setupFiles(在测试框架加载前运行,一般用不到)。

coverageThreshold — 覆盖率门禁。团队规范通常设 branches: 80, functions: 80, lines: 80,CI 中低于阈值直接失败。

preset — 一键继承预置配置。ts-jest 提供 preset: 'ts-jest',React 项目用 react-app(CRA)或 @testing-library/react/jest-dom。preset 和手动配置重复时,手动配置优先。

projects — monorepo 专属,每个子项目可以独立配置 testEnvironment、transform 等,Jest 并行跑所有项目。

追问

testEnvironment 选 node 还是 jsdom 怎么决定?

跑纯函数、Node API 用 node;涉及 DOM 操作、React 渲染用 jsdomjsdom 内存开销大,API 不完整(没有 canvas 布局、IntersectionObserver),需要额外 mock。同一个项目可以按目录分 projects 配不同环境。

transformIgnorePatterns 配了但不生效怎么办?

先跑 npx jest --showConfig 看实际合并后的配置,preset 可能覆盖了你的设置。常见坑:正则里的路径分隔符在 Windows 上不一致,或者忘了负向断言里的 /。清缓存 jest --clearCache 再试。

Jest 跑 ESM 包一直报 SyntaxError 怎么排查?

三步:1)确认 transform 配了对应转换器;2)检查 transformIgnorePatterns 是否把该包排除了忽略列表;3)如果包本身只导出 ESM,考虑用 moduleNameMapper 指向 CJS 入口或者直接 mock 掉。

monorepo 里 packages 互相依赖怎么配 Jest?

projects 配置,每个 package 指定自己的 rootDirtestMatch。packages 间依赖通过 moduleNameMapper 映射到源码目录而不是 dist,这样改了依赖包的代码测试立即生效。

写段代码

js
// jest.config.js — React + TS 项目典型配置 module.exports = { testEnvironment: 'jsdom', transform: { '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest' }, moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', '\\.(css|less)$': 'identity-obj-proxy', }, transformIgnorePatterns: [ '/node_modules/(?!(lodash-es)/)', ], setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80 }, }, };
标签:Jest