JavaScript类与对象方法的单元测试需用Jest等框架隔离调用,验证返回值、副作用及异常;区分纯函数、实例方法和依赖外部服务三类,分别采用传参断言、构造实例检查状态、mock依赖等方式。

在 JavaScript 中对类和对象的方法编写单元测试,核心是用测试框架(如 Jest、Vitest 或 Mocha)隔离调用目标方法,验证其行为是否符合预期——包括返回值、副作用(如修改状态、调用其他函数)、异常抛出等。
明确被测方法的类型和依赖
先区分方法是:
-
纯函数式方法:无副作用、只依赖入参,例如
calculateTotal(items);直接传参断言返回值即可。 -
实例方法(访问 this 状态):如
cart.addItem(item),需构造真实或模拟实例,检查this属性变化。 -
依赖外部服务/函数的方法:如调用了
fetch、localStorage或第三方工具函数;需用 mock 替换依赖,控制输入输出。
用 Jest 编写典型场景示例
以一个简单购物车类为例:
class Cart {
constructor() {
this.items = [];
}
addItem(item) {
if (!item || !item.name) throw new Error('Invalid item');
this.items.push({ ...item, id: Date.now() });
}
getTotal() {
return this.items.reduce((sum, i) => sum + (i.price || 0), 0);
}
}
对应测试可这样写:
-
测试实例方法逻辑:
创建新实例 → 调用方法 → 断言this.items长度、结构或getTotal()结果。 -
测试异常路径:
使用expect(() => cart.addItem(null)).toThrow('Invalid item')验证错误抛出。 -
避免副作用干扰:
每个测试用beforeEach创建全新实例,不共用状态。
处理依赖与边界情况
若方法内部调用异步 API 或定时器:
- 用
jest.mock('module-path')或jest.fn()替换依赖,例如 mockfetch返回固定响应; - 异步方法用
async/await+expect(...).resolves或.rejects; - 涉及
setTimeout时,用jest.useFakeTimers()控制时间流,再用jest.runAllTimers()触发回调。
保持测试简洁可维护
每个测试用例聚焦一个行为点:
- 方法名体现意图,如
should add item with generated id; - 输入数据尽量轻量,避免构造复杂嵌套对象;
- 优先断言业务结果(如总价、数量),而非实现细节(如是否调用了某个私有方法);
- 私有方法不直接测——通过公共方法的输入输出覆盖其逻辑。


















