jest测试js class的核心是实例化、调用方法、断言结果并隔离依赖;需用beforeeach初始化实例,mock外部函数/fetch/定时器,通过公有接口验证状态,避免测试私有实现细节。

用 Jest 测试 JS class,核心是实例化类、调用方法、断言返回值或状态变化,同时注意隔离依赖(如 mock 外部函数、定时器、fetch 等)。
1. 基础类与对应测试结构
假设有一个简单的计数器类:
class Counter {constructor(initial = 0) {
this.value = initial;
}
increment() { this.value++; }
decrement() { this.value--; }
reset() { this.value = 0; }
}
对应测试可写为:
let counter;
beforeEach(() => {
counter = new Counter(5);
});
test('increment increases value by 1', () => {
counter.increment();
expect(counter.value).toBe(6);
});
test('reset sets value to 0', () => {
counter.reset();
expect(counter.value).toBe(0);
});
});
2. 测试含异步逻辑的类方法
若类中使用 setTimeout、fetch 或 Promise,需用 async/await + jest.useFakeTimers() 或 mockResolvedValue。
- 对定时器:调用 jest.useFakeTimers() 后,用 jest.runAllTimers() 触发回调
- 对 fetch:用 global.fetch = jest.fn() 并 mock 返回值
- 对其他 Promise 方法:直接 mock 成返回 resolved/rejected 的 Promise
3. 验证私有状态与行为(非真正私有,但约定下划线)
JS class 没有语法级私有字段(#field 是私有,但不可直接测),常见做法是:
- 通过公有方法间接验证内部状态变化(如调用 save() 后检查 this._isSaved === true)
- 对 #privateField,只能靠行为断言(例如私有方法被调用次数),需配合 jest.spyOn 和内部函数引用(不推荐暴露私有方法,更建议测接口而非实现)
- 避免过度测试实现细节;优先保证输入→输出、副作用(如事件触发、DOM 更新、API 调用)正确
4. Mock 依赖与隔离外部影响
当 class 依赖外部模块(如 API 客户端、工具函数),应将其注入或在测试中替换:
- 构造函数传入依赖(推荐:利于测试和解耦)
- 测试中用 jest.mock('./api') 或 jest.mock('axios') 替换模块
- 对单个方法 mock:jest.spyOn(obj, 'methodName').mockImplementation(...)
- 确保每个 test 用 mockClear() 或 mockReset() 清理调用记录











