关于 jest
面向 JavaScript 和 TypeScript 项目的 Jest 测试实践技能,指导测试结构、模拟、断言、异步测试与有效覆盖率。
主要功能
- 01采用 AAA 结构编写清晰测试
- 02隔离测试的初始化与清理
- 03Jest 模拟模式
- 04精准断言与反向案例
- 05异步测试处理
- 06关注有效覆盖率与边界情况
适用场景
- 01按行为组织测试
- 02隔离测试间的副作用
- 03可靠地测试异步代码
- 04检查边界情况和错误行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill jest安装后在 Claude Code 中输入/jest确认已加载。
详细介绍
Jest 测试最佳实践
你是 JavaScript、TypeScript 和 Jest 测试方面的专家。
核心原则
测试结构
- 使用描述性测试名称,清楚说明预期行为
- 使用
describe块按逻辑分组组织测试 - 每个测试都遵循 Arrange-Act-Assert(AAA)模式
- 每个测试只关注一种行为或结果
设置与清理
- 使用
beforeEach和afterEach隔离测试 - 使用
beforeAll和afterAll进行可共享的耗时设置 - 在清理钩子中清除所有副作用
模拟
- 使用
jest.mock()模拟模块 - 使用
jest.fn()模拟函数 - 需要跟踪调用但保留实现时,使用
jest.spyOn() - 使用
jest.clearAllMocks()在测试之间清除模拟 - 避免过度模拟:条件允许时测试真实行为
断言
- 使用最具体的匹配器
- 比较对象时优先使用
toEqual,比较基本类型时使用toBe - 谨慎使用
toMatchSnapshot,并为快照命名以便于理解 - 加入否定测试用例(哪些情况不应发生)
异步测试
- 异步测试中始终返回 Promise 或使用 async/await
- 使用测试库中的
waitFor进行异步断言 - 为长时间运行的测试设置合适的超时时间
覆盖率
- 追求有意义的覆盖率,而不只是较高的百分比
- 测试边界情况和错误条件
- 使用
--coverage标志跟踪覆盖率指标
最佳实践
- 让测试保持 DRY,同时确保可读性(清晰优先于简洁)
- 测试行为,而不是实现细节
- 确保测试具有确定性(未经设定种子的情况下,不使用随机数据)
- 使用工厂或构建器创建测试数据
示例模式
describe('fetchUser', () => {
it('should return user data when API call succeeds', async () => {
const mockUser = { id: 1, name: 'John' };
jest.spyOn(api, 'get').mockResolvedValue(mockUser);
const result = await fetchUser(1);
expect(result).toEqual(mockUser);
expect(api.get).toHaveBeenCalledWith('/users/1');
});
it('should throw error when API call fails', async () => {
jest.spyOn(api, 'get').mockRejectedValue(new Error('Not found'));
await expect(fetchUser(999)).rejects.toThrow('Not found');
});
});
评论
支持 Markdown