从 v29 升级到 v30
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
正在从 Jest v29 升级到 v30?本指南将帮助您重构配置和测试。
完整变更列表请参阅更新日志。
从更旧版本升级?可查看v28升级到v29的指南。
兼容性
-
Jest 30 停止支持 Node 14、16、19 和 21。最低支持版本变更为 Node 18.x。升级前请确保运行环境使用兼容的 Node 版本。
-
TypeScript 最低版本要求提升至 5.4。若使用 Jest(或其任何包)的类型定义,请更新 TypeScript。
-
jest-environment-jsdom包现采用 JSDOM v26。此更新可能导致 DOM 环境行为变化。如遇 DOM 行为差异或新警告,请参考 JSDOM v21–26 版本说明。
Jest Expect 和匹配器
别名匹配器移除
所有匹配器别名已移除,请使用主名称替代。若您仍在使用旧版弃用的匹配器名称,需更新测试代码:
- 已移除别名及对应替代方案:
expect(fn).toBeCalled()→expect(fn).toHaveBeenCalled()expect(fn).toBeCalledTimes(n)→expect(fn).toHaveBeenCalledTimes(n)expect(fn).toBeCalledWith(arg)→expect(fn).toHaveBeenCalledWith(arg)expect(fn).lastCalledWith(arg)→expect(fn).toHaveBeenLastCalledWith(arg)expect(fn).nthCalledWith(n, arg)→expect(fn).toHaveBeenNthCalledWith(n, arg)expect(fn).toReturn()→expect(fn).toHaveReturned()expect(fn).toReturnTimes(n)→expect(fn).toHaveReturnedTimes(n)expect(fn).toReturnWith(val)→expect(fn).toHaveReturnedWith(val)expect(fn).lastReturnedWith(val)→expect(fn).toHaveLastReturnedWith(val)expect(fn).nthReturnedWith(n, val)→expect(fn).toHaveNthReturnedWith(n, val)expect(func).toThrowError(message)→expect(func).toThrow(message)
这些别名方法自 Jest 26 起已被弃用,在 Jest 30 中已彻底移除。请在代码库中全局搜索替换为规范匹配器名称。功能完全一致——仅方法名称变更。(若使用带 eslint-plugin-jest 的 ESLint,no-alias-methods 规则可自动完成替换。)
非可枚举属性
对象匹配器现默认排除非可枚举属性。这可能影响 expect.objectContaining 或相等性检查。
CalledWith 类型推断改进
TypeScript 用户注意:CalledWith 系列匹配器(如 toHaveBeenCalledWith)的类型推断已优化,可更准确推导函数参数类型。多数情况下能更精准捕获类型不匹配问题。这是编译时破坏性变更。
如果你在测试中使用了与实际函数参数类型不匹配的参数进行调用断言,TypeScript 现在可能会在这些测试中报错。例如,如果一个函数的类型定义为接受数字参数,而你写了 expect(fn).toHaveBeenCalledWith("string"),TypeScript 5 + Jest 30 的类型系统将会标记此错误。匹配器的运行时行为并未改变。
要修复这些新的 TypeScript 错误 ,请确保你的测试参数与函数期望的类型一致(或者,如果你故意使用不同的类型进行调用,可以使用类型转换)。
这项更改不会影响运行时行为,但它可能会暴露你测试中之前未被注意到的类型错误,从而使你的测试更具类型安全性。
配置更新
支持 .mts 和 .cts 文件扩展名
Jest 30 扩展了对 ESM 和 TypeScript 模块文件扩展名的支持:
-
默认的
moduleFileExtensions现在包含了.mts和.cts(TypeScript ESM 和 CommonJS 模块),以及常规扩展名。 -
默认的
testMatch和testRegex模式已更新,现在可以识别.mjs、.cjs、.mts和.cts文件作为测试文件。
如果你的项目中包含这些扩展名的文件,但不打算将它们视为模块或测试文件,你可能需要调整配置。反之,如果你有使用这些扩展名 的测试文件,Jest 现在默认会检测到它们(你可以移除之前为了包含它们而添加的自定义配置)。
--testPathPattern 已重命名为 --testPathPatterns
如果你通过路径过滤测试,请注意 CLI 标志已更改:--testPathPattern 标志现在改为 --testPathPatterns。你可以通过用空格分隔模式或重复使用该标志来传递多个模式。例如:
# Old (Jest 29)
jest --testPathPattern="unit/.*"
# New (Jest 30)
jest --testPathPatterns "unit/.*" "integration/.*"
在内部,Jest 会将这些模式合并为一个 TestPathPatterns 对象。如果你之前以编程方式使用 testPathPattern 调用 Jest 的观察模式,现在必须改为构造一个 TestPathPatterns 实例。
移除 --init 命令
交互式配置初始化命令 jest --init 已被移除。这个已弃用的命令曾用于搭建 Jest 配置文件。如果你需要创建配置,可以运行:
npm init jest@latest
# Or for Yarn
yarn create jest
# Or for pnpm
pnpm create jest
其他 CLI 变更
-
Jest 现在会验证需要参数的 CLI 标志,以确保提供了参数。例如,如果你使用
--maxWorkers或--selectProjects,必须包含一个值(例如--maxWorkers=50%)。之前,Jest 可能允许某些标志没有值(回退到默认值);现在如果缺少值,它将抛出错误。请确保任何传递 Jest 标志的脚本或 npm 命令都包含必要的参数。 -
如果你使用
--filter选项来过滤测试文件(这是一种高级用法,你需要提供一个过滤实现的路径),预期的接口已更改。现在,过滤函数应返回一个形如{filtered: Array<string>}的对象,与文档格式一致。在之前的版本中,可能接受不同的返回格式(例如直接返回数组)。请更新所有自定义测试过滤函数,以返回一个带有filtered属性的对象,如文档所述。