SuperAPI AI 工具集

jest

测试与质量

查看项目

更新于 10-15 14:47

技能介绍

用途

Jest 是一个 JavaScript/TypeScript 测试框架,适用于单元测试、集成测试和快照测试。它内置测试运行器、断言库、Mock 系统和覆盖率报告器。本技能围绕 Jest 自身的 API 与使用模式提供指导,属于基础层;框架特定的测试模式可结合其他配套技能使用。

主要能力与规则分类

技能内容按优先级分为九类规则:

  1. Mock 设计(CRITICAL,前缀 mock-,5 条规则):clearAllMocks / resetAllMocks / restoreAllMocks 的区别;始终恢复 jest.spyOn,优先使用 restoreMocks 配置;jest.mock 工厂不能引用外部变量;使用 jest.requireActual 做部分模块 Mock;明确该 Mock 什么、不该 Mock 什么及 Mock 边界。
  2. 异步测试(CRITICAL,前缀 async-):始终 return/await Promise,否则断言会被跳过;使用 expect.assertions(n) 验证异步断言确实执行;使用 done 回调时用 try/catch 包裹 expect。
  3. 匹配器使用(HIGH,前缀 matcher-):toBe 与 toEqual 与 toStrictEqual 的选择;浮点数使用 toBeCloseTo,绝不用 toBe;对抛错代码用箭头函数包裹以配合 toThrow。
  4. 定时器 Mock(HIGH,前缀 timer-):递归定时器使用 runOnlyPendingTimers;涉及 Promise 时使用异步定时器方法;使用 doNotFake 保留特定 API 为真实实现。
  5. 测试结构(HIGH,前缀 structure-):beforeEach/afterEach 的作用域限于 describe 块;每个测试必须独立,在 beforeEach 中重置状态;测试必须同步定义。
  6. 模块 Mock(MEDIUM,前缀 module-):mocks 目录约定;ESM 使用 jest.unstable_mockModule;jest.doMock + resetModules 实现按测试 Mock。
  7. 快照测试(MEDIUM,前缀 snapshot-):保持快照小而聚焦;对动态字段使用属性匹配器;Mock 非确定性值以获得稳定快照。
  8. 配置(MEDIUM,前缀 config-):按目录设置覆盖率阈值;为 ESM 包配置 transformIgnorePatterns;用文件级 @jest-environment 文档块替代全局 jsdom。
  9. 性能与 CI(MEDIUM,前缀 perf-):CI 中使用 --runInBand 或 --maxWorkers;用 jest.isolateModules 隔离每个测试的模块状态。

使用方式

阅读各规则文件获取详细说明与代码示例,例如 rules/mock-clear-vs-reset-vs-restore.md、rules/async-always-await.md。每个规则文件包含:为何重要的简要说明、带解释的错误代码示例、带解释的正确代码示例,以及额外上下文和决策表。

参考文档按优先级阅读:references/matchers.md(全部匹配器)、references/mock-functions.md(jest.fn、jest.spyOn、.mock 属性等)、references/jest-object.md(jest.mock、jest.useFakeTimers、jest.setTimeout、jest.retryTimes)、references/async-patterns.md(Promise、async/await、done 回调、.resolves/.rejects)、references/configuration.md(testMatch、transform、moduleNameMapper、coverage、环境)、references/snapshot-testing.md、references/module-mocking.md、references/anti-patterns.md(15 个常见错误及 BAD/GOOD 示例)、references/ci-and-debugging.md。完整指南见 AGENTS.md。

适用场景

  • JS/TS 单元测试与集成测试:Jest
  • React 组件测试:Jest + React Testing Library
  • 端到端浏览器测试:Playwright、Cypress
  • API 契约测试:Jest + Supertest
  • 更小/更快的测试运行器:Vitest(兼容 Jest API)
  • 无需配置的原生 ESM:Vitest 或 Node test runner

限制与注意事项

资料明确提示:关于 Jest 的训练数据可能过时或不正确。Jest 29+ 引入了异步定时器方法、jest.replaceProperty 以及通过 jest.unstable_mockModule 进行 ESM Mock。Jest 30 移除了已弃用的别名匹配器(toBeCalled、lastCalledWith、toThrowError 等),将 --testPathPattern 重命名为 --testPathPatterns,并从对象匹配器中排除不可枚举属性。应始终以本技能的规则文件和项目实际源码为准,当记忆中的模式与检索到的参考冲突时,不要回退到记忆模式。

配套技能

本技能覆盖 Jest 自身 API 面。基于 Jest 的框架特定测试模式可使用配套技能:API 网络层 Mock 用 msw;React Native 组件用 react-native-testing;Zod 模式校验用 zod-testing;Redux-Saga 副作用用 redux-saga-testing;Java 测试用 java-testing。Jest 技能提供测试生命周期(describe、test、beforeEach、afterEach)、Mock 系统(jest.fn、jest.mock、jest.spyOn)、断言引擎(expect、匹配器)和配置(jest.config.js),配套技能在其之上提供各自 API 的模式。