1. 环境准备
要在项目中使用 TypeScript 和 Jest,首先确保你已安装以下工具:
·Node.js(建议使用 v16 或更高版本)
· npm 或 yarn
· TypeScript(建议使用最新版)
确认安装:
node -v
npm -v
2. 配置项目
2.1 初始化项目
创建一个新的 Node.js 项目并初始化:
mkdir ts-jest-example
cd ts-jest-example
npm init -y
2.2 配置 TypeScript
安装 TypeScript 及相关工具:
npm install typescript @types/node --save-dev
初始化 TypeScript 配置:
npx tsc --init
修改 tsconfig.json 配置,确保开启以下选项:
{
"compilerOptions": {
"target": "ES2017",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"outDir": "./dist",
"rootDir": "./src"
}
}
创建 src 文件夹,用于存放代码和测试。
2.3 安装 Jest 及相关依赖
安装 Jest 和 TypeScript 支持插件:
npm install jest ts-jest @types/jest --save-dev
初始化 Jest 配置:
npx ts-jest config:init
此命令会生成一个 jest.config.js 文件,配置示例如下:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
rootDir: 'src',
};
3. 编写测试
以下以一个简单的函数为例,展示如何编写和测试代码。
3.1 编写简单的测试用例
创建文件 src/utils.ts:
// utils.ts
export const sum = (a: number, b: number): number => {
return a + b;
};
为 sum 函数编写测试,创建文件 src/utils.test.ts:
// utils.test.ts
import { sum } from './utils';
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
运行测试:
npx jest
输出结果:
PASS src/utils.test.ts
√ adds 1 + 2 to equal 3 (5 ms)
3.2 测试异步代码
创建一个异步函数 src/asyncUtils.ts:
// asyncUtils.ts
export const fetchData = async (): Promise<string> => {
return new Promise((resolve) => {
setTimeout(() => resolve('Hello, Jest!'), 1000);
});
};
编写测试文件 src/asyncUtils.test.ts:
// asyncUtils.test.ts
import { fetchData } from './asyncUtils';
test('fetchData returns correct data', async () => {
const data = await fetchData();
expect(data).toBe('Hello, Jest!');
});
运行测试:
npx jest
3.3 测试接口调用(Mock 示例)
编写一个调用接口的函数 src/api.ts:
// api.ts
import axios from 'axios';
export const getUser = async (id: number): Promise<any> => {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
return response.data;
};
为 getUser 函数编写测试,使用 Jest Mock:
// api.test.ts
import { getUser } from './api';
import axios from 'axios';
// Mock axios
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;
test('fetches user data', async () => {
const mockUser = { id: 1, name: 'John Doe' };
mockedAxios.get.mockResolvedValueOnce({ data: mockUser });
const user = await getUser(1);
expect(user).toEqual(mockUser);
expect(mockedAxios.get).toHaveBeenCalledWith('https://jsonplaceholder.typicode.com/users/1');
});
运行测试并验证 Mock 功能。
4. 运行与调试
运行所有测试:
npx jest
运行单个测试文件:
npx jest src/utils.test.ts
在调试工具中运行测试(如 VSCode 的调试功能):
在项目根目录创建 launch.json 文件。
配置如下:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Jest Tests",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["--runInBand"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
选择配置并开始调试。
5. 最佳实践
目录结构建议:
src:主代码文件夹。
tests:测试文件夹(可选,适用于大型项目)。
命名规范:
测试文件以 .test.ts 或 .spec.ts 结尾。
与被测试文件放在同一目录下或单独维护测试目录。
使用 Mock 减少依赖:
对于外部接口、数据库等不易直接测试的部分,使用 Jest Mock 减少测试依赖。
确保代码覆盖率:
添加覆盖率报告:
npx jest --coverage
6. 总结
通过结合 TypeScript 和 Jest,你可以实现类型安全、高质量的单元测试流程。Jest 提供了强大的 Mock 功能和丰富的测试工具,能有效提升开发效率。希望本文的指南和示例能帮助你更好地掌握 Jest 和 TypeScript 的测试方法!
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取