为工具函数写单元测试应聚焦行为边界、输入组合与异常路径,覆盖典型/边界/非法输入,验证容错策略、纯函数特性及副作用控制,并用工厂函数和参数化测试提升可维护性。

为工具类函数编写全面的单元测试,核心是覆盖其行为边界、输入组合与异常路径,而不是追求行数堆砌。重点在于用例设计是否反映函数的真实使用场景和潜在风险点。
覆盖典型输入与边界值
工具函数常被多处调用,输入类型和范围变化大。必须显式验证常见合法输入、空/零值、极值、非法类型等。
- 对数字类工具(如
clamp(min, val, max)):测val 、val > max、min === max、NaN、null等情况 - 对字符串类工具(如
truncate(str, len)):测空字符串、len === 0、len > str.length、含 Unicode 字符(如 emoji)、undefined输入 - 对数组类工具(如
unique(arr)):测空数组、单元素、重复全同、含NaN或对象引用、稀疏数组
明确处理非预期输入
工具函数不应对错误输入静默失败。需根据设计约定,统一返回默认值、抛错或记录警告,并在测试中验证该行为。
- 若函数声明“仅接受字符串”,则传入数字或对象时应
throw TypeError,测试中用expect(() => fn(123)).toThrow() - 若函数容错设计(如
parseNumber(input)返回NaN而非报错),则必须测试所有可能转为NaN的输入:''、'abc'、undefined、{} - 避免用
try/catch包裹断言——Jest 的toThrow和 Chai 的to.throw才是正确校验方式
验证纯函数特性(如适用)
多数工具函数应是纯函数:相同输入恒得相同输出,且无副作用。测试需主动检查这两点。
- 同一输入多次调用,结果一致:
expect(fn(x)).toBe(fn(x)) - 不修改原始参数:
const arr = [1,2,3]; fn(arr); expect(arr).toEqual([1,2,3]) - 不读取或更改外部变量(如
Math.random、Date.now()),必要时用 mock 隔离(如 Jest 的jest.mock('date-fns'))
用工厂函数管理测试数据
避免测试用例内硬编码大量字面量。提取可复用的数据构造逻辑,提升可读性与维护性。
- 定义
createValidUser()、createInvalidEmail()等工厂函数,集中管理测试数据生成规则 - 对结构复杂输入(如嵌套对象、带方法的对象),用工厂统一构造,避免各测试中重复拼接
- 配合
describe.each(Jest)或it.each快速批量验证同类场景,例如:
describe.each([
['empty string', ''],
['whitespace only', ' \t\n'],
['null', null],
['undefined', undefined]
])('trim(%s)', (_, input) => {
test('returns empty string', () => {
expect(trim(input)).toBe('');
});
});
```
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











