什么是 Jest,为什么它对 TypeScript 是必需的?
Jest 是一个强大且流行的 JavaScript 和 TypeScript 测试框架,由 Meta(Facebook)公司开发。它提供了编写单元测试、集成测试和快照测试所需的一切“开箱即用”功能:断言库、模拟(mocks)、间谍(spies)、计时器和代码覆盖率。对于 TypeScript 来说,Jest 尤其有价值,因为它允许在测试执行期间检查类型,从而提高了代码的可靠性。将 Jest 与 TypeScript 结合使用,可以帮助开发者更快地发现错误,自信地重构代码,并保持项目的高质量。
安装与配置
首先,通过 npm 或 yarn 安装 Jest 及其所需的类型:
npm install --save-dev jest @types/jest ts-jest typescript然后,初始化 Jest 配置:
npx ts-jest config:init这将创建一个包含 TypeScript 设置的 jest.config.js 文件。确保在 tsconfig.json 中设置了 "module": "commonjs",或者使用 ts-node 来处理 ESM。
主要功能
- describe 和 it/test — 用于分组和编写测试。
- expect — 断言函数,包含多种匹配器(toBe、toEqual、toContain、toThrow 等)。
- beforeEach / afterEach — 用于准备和清理环境的钩子。
- jest.mock — 自动模拟模块。
- jest.spyOn — 监视函数调用。
- 快照测试 — 比较组件输出。
- 代码覆盖率 — 内置的
--coverage工具。
TypeScript 代码示例
// math.tsexport const add = (a: number, b: number): number => a + b;export const divide = (a: number, b: number): number => { if (b === 0) throw new Error('Division by zero'); return a / b;};
// math.test.tsimport { add, divide } from './math';
describe('Math functions', () => { test('adds two numbers correctly', () => { expect(add(2, 3)).toBe(5); expect(add(-1, 1)).toBe(0); });
test('throws error when dividing by zero', () => { expect(() => divide(10, 0)).toThrow('Division by zero'); });
test('divides correctly', () => { expect(divide(10, 2)).toBe(5); expect(divide(9, 3)).toBeCloseTo(3); });});何时使用 Jest 与 TypeScript?
- 任何 TypeScript 项目 — 从小型库到大型应用程序。
- 使用 TDD 开发 — Jest 非常适合在实现之前编写测试。
- 重构 — 确保更改不会破坏现有逻辑。
- CI/CD 流水线 — 快速运行测试并检查覆盖率。
- 测试 React 组件 — 结合 @testing-library/react 使用。
Jest 是测试 TypeScript 的事实标准,这得益于其简单的配置、丰富的 API 以及与现代化工具的出色集成。