javascript单元测试中应使用expect()配合语义化匹配器断言,如tobe、toequal、tocontain、resolves/tothrow等,并避免未await、误用tobe比较引用类型等常见错误。

JavaScript 单元测试中,断言函数用于判断实际结果是否符合预期,是验证测试通过与否的核心手段。主流测试框架(如 Jest、Vitest、Mocha)都内置了丰富的断言 API,用法直观,但关键在于理解“断什么”和“怎么断得清晰可靠”。
使用 expect() 进行基础值比对
Jest 和 Vitest 推荐使用 expect(actual).toBe(expected) 验证严格相等(===),适合原始值(数字、字符串、布尔值):
-
✅ 正确写法:
expect(add(2, 3)).toBe(5); - ❌ 避免直接用 if + throw:手动抛错可读性差、不提供上下文信息,也不支持链式匹配器。
针对不同数据类型选择合适匹配器
不要只依赖 toBe。对象、数组、异步操作等需用语义化更强的断言:
- 对象相等用
toEqual(深比较):expect(user).toEqual({ name: 'Alice', age: 30 }); - 数组包含某项用
toContain:expect(['a', 'b']).toContain('b'); - 异步函数返回 Promise 时,用
resolves或rejects:await expect(fetchData()).resolves.toEqual({ id: 1 }); - 验证错误抛出用
toThrow:expect(() => parseJSON('invalid')).toThrow();
自定义断言逻辑(必要时)
当内置匹配器不够用(比如校验浮点数近似相等、对象部分字段、正则匹配),可借助 expect.extend() 扩展:
- 例如添加
toBeWithinRange:expect.extend({ toBeWithinRange(received, floor, ceiling) { return { pass: received >= floor && received `expected ${received} to be within ${floor}–${ceiling}` }; }}); - 之后就能写:
expect(3.14).toBeWithinRange(3, 4);
避免常见陷阱
断言失效往往不是代码错,而是断言本身写错了:
- 忘记
await导致 Promise 对象被断言,而非其结果; - 用
toBe比较对象或数组(引用相等),应改用toEqual; - 在测试中修改被测对象后才断言,可能掩盖副作用问题;
- 多个断言混在一个 test 中,建议一个 test 只验证一个行为,失败时定位更准。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











