工具类方法单元测试应视作纯函数验证:输入确定则输出确定,无副作用;需明确边界,对时间、随机数等副作用用 Jest 控制,保持测试轻量快速、互不干扰。

对工具类方法做单元测试,核心是把它当成“纯函数”来验证:输入确定,输出确定,不依赖外部状态。只要方法没副作用、不调用 DOM、不发请求、不读写 localStorage,就很容易测。
明确工具类的边界和依赖
先确认这个工具类是否真正“独立”。常见情况包括:
- 纯计算类(如 formatDate、deepClone、debounce)——可直接测试,无需 mock
- 依赖全局对象(如 Date.now()、Math.random())——需在测试前固定返回值
- 内部调用其他模块(如使用 axios 或自定义 apiClient)——应抽离依赖,或用 jest.mock 模拟
- 操作 DOM 或 window ——这类已超出“工具类”范畴,建议重构或改用集成测试
用 Jest 写清晰、覆盖全面的测试用例
以一个常见的 throttle 工具函数为例:
// utils.js
export function throttle(fn, delay) {
let lastCall = 0;
return function (...args) {
const now = Date.now();
if (now - lastCall >= delay) {
fn(...args);
lastCall = now;
}
};
}
对应测试可这样组织:
// utils.test.js
import { throttle } from './utils';
<p>describe('throttle', () => {
test('calls fn immediately on first invocation', () => {
const mockFn = jest.fn();
const throttled = throttle(mockFn, 100);
throttled();
expect(mockFn).toHaveBeenCalledTimes(1);
});</p><p>test('ignores calls within delay window', () => {
jest.useFakeTimers();
const mockFn = jest.fn();
const throttled = throttle(mockFn, 100);</p><pre class="brush:php;toolbar:false;">throttled(); // t=0 → called
jest.advanceTimersByTime(50);
throttled(); // t=50 → ignored
jest.advanceTimersByTime(50);
throttled(); // t=100 → called
expect(mockFn).toHaveBeenCalledTimes(2);
jest.useRealTimers();
}); });
关键点:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 用 jest.useFakeTimers() 控制时间,避免真实等待
- 每个 test 只验证一个行为,输入、执行、断言三步清晰
- 覆盖正常逻辑 + 边界情况(如 delay=0、fn 为 null)
处理常见副作用:时间、随机数、环境判断
工具类里若用了 Date.now()、Math.random() 或 process.env.NODE_ENV,测试时要主动控制:
- Date.now():用 jest.useFakeTimers() + jest.setSystemTime()
- Math.random():在测试前设固定值,Math.random = jest.fn(() => 0.123)
- 环境变量:测试前临时修改,process.env.NODE_ENV = 'test',结束后还原
保持测试轻量且可重复
工具类测试应满足几个实际要求:
- 运行快:单个用例应在 10ms 内完成
- 不互相干扰:每个 test 前重置 mock、恢复全局状态
- 失败即明确:错误信息能直接指出哪个输入导致了哪个预期不满足
- 不依赖磁盘或网络:所有数据内联提供,比如用 JSON.stringify 而非读文件
不需要为工具类写快照测试,也不需要渲染组件——它不产生 UI,只关心输入输出逻辑是否守恒。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










