TypeScript 测试:高质量开发的框架与工具
TypeScript 是一种强大的语言,为 JavaScript 增加了静态类型检查。然而,即使有严格的类型,也无法保证没有逻辑错误。为了确保代码的可靠性,必须进行测试。本文将介绍用于测试 TypeScript 应用程序的关键工具和框架:从单元测试到端到端(E2E)测试。
为什么要测试 TypeScript 代码?
TypeScript 编译器可以捕获类型错误,但不会检查业务逻辑。测试有助于:
- 在重构时发现回归问题
- 记录函数的预期行为
- 通过自动验证加速代码审查
- 增强对应用程序运行的信心
测试的主要类别
- 单元测试 — 检查单个函数、类或模块。
- 集成测试 — 模块之间的交互(例如,与数据库)。
- E2E 测试 — 在浏览器中模拟用户操作。
1. Jest — 通用的单元测试框架
来自 Facebook 的 Jest 是 TypeScript 最流行的选择。它开箱即用:无需复杂配置,内置 mock 引擎和代码覆盖率报告。
安装:
npm install --save-dev jest @types/jest ts-jest在 jest.config.ts 中添加:
export default { preset: 'ts-jest', testEnvironment: 'node',};函数单元测试示例:
// math.tsexport const add = (a: number, b: number): number => a + b;
// math.test.tsimport { add } from './math';
describe('add', () => { it('should return sum of two numbers', () => { expect(add(2, 3)).toBe(5); });
it('should handle negative numbers', () => { expect(add(-1, -2)).toBe(-3); });});Jest 中的模拟(mocks):
// api.tsexport const fetchData = async (id: string) => { const response = await fetch(`/api/${id}`); return response.json();};
// api.test.tsjest.mock('./api', () => ({ fetchData: jest.fn().mockResolvedValue({ id: '1', name: 'Test' }),}));
import { fetchData } from './api';
test('should return mocked data', async () => { const data = await fetchData('1'); expect(data.name).toBe('Test');});2. Mocha + Chai — 灵活的替代方案
Mocha 是一个测试运行器,让你完全控制整个过程。Chai 增加了富有表现力的断言。
安装:
npm install --save-dev mocha chai @types/mocha @types/chai ts-node异步集成测试示例:
// database.tsexport class Database { async getUser(id: number): Promise<{ id: number; name: string }> { // 模拟查询 return { id, name: 'Alice' }; }}
// database.test.tsimport { expect } from 'chai';import { Database } from './database';
describe('Database', () => { it('should return user by id', async () => { const db = new Database(); const user = await db.getUser(1); expect(user).to.have.property('name', 'Alice'); });});使用命令 mocha --require ts-node/register src/**/*.test.ts 运行。
3. Cypress — 用于 Web 应用程序的 E2E 测试
Cypress 非常适合测试 TypeScript 前端。它在真实浏览器中运行,并具有便捷的 GUI 界面。
安装:
npm install --save-dev cypress @cypress/types登录页面的 E2E 测试示例