前端JavaScript单元测试核心是验证“输入→处理→输出”行为,需聚焦典型与边界场景,冻结随机/时间依赖,用test/expect编写可读用例,按语义分组describe,辅以工厂函数生成测试数据。

前端开发中写 JavaScript 单元测试,核心是围绕“输入→处理→输出”这条主线,用可预测的数据验证函数行为是否稳定、正确。不需要覆盖所有分支,但要抓住典型场景和边界情况。
明确被测函数的职责和边界
先看清函数干了什么:它是否纯函数(无副作用、不依赖外部状态)?输入类型有哪些?哪些是合法输入,哪些会触发错误?比如一个日期格式化工具函数,就要关注 null、非法字符串、时区偏移等边界值。
- 若函数依赖 Date.now() 或 Math.random(),测试前需用 jest.useFakeTimers() 或 jest.spyOn(Math, 'random').mockReturnValue(0.5) 冻结它们
- 避免在测试里直接 new Date(),改用固定时间工厂,如 const today = () => new Date(2026, 9, 1)
- 对可能抛错的逻辑(如解析失败),提前想好错误类型和消息结构,方便后续用 toThrow() 验证
用 test + expect 编写可读的测试用例
每个 test() 应聚焦一个明确行为,描述文字要像一句自然语言断言,比如 “format 返回 YYYY-MM-DD 格式字符串” 而不是 “test format”。expect 后必须接匹配器,不能写成 expect(add(1, 2) === 3) —— 这样失败时不显示期望值与实际值差异。
- 基本类型比较用 toBe()(严格相等)
- 对象或数组用 toEqual()(深度相等)
- 验证异常用 toThrow('Invalid date'),支持字符串、正则或构造函数
- 异步函数需显式等待:函数标 async 并 await,或 return Promise,否则 Jest 会跳过断言
按语义分组,用 describe 拆解不同场景
一个工具函数常有多个子行为,比如字符串处理函数可能涉及截断、去空格、大小写转换。不要堆在一个 test 块里,而是用 describe 划分逻辑域:
立即学习“Java免费学习笔记(深入)”;
- describe('trim', () => { ... }) 专注空白字符处理
- describe('truncate', () => { ... }) 处理长度限制与省略号
- describe('case conversion', () => { ... }) 覆盖 toUpper/toLower/toTitle 等变体
这样报错时能快速定位到哪一组逻辑出问题,也方便后续添加新 case 不影响已有结构。
减少硬编码,用工厂函数生成测试数据
重复写 { name: 'Alice', age: 25 } 很容易出错且难维护。定义清晰命名的工厂,让测试意图一目了然:
- const validUser = () => ({ id: 1, email: 'test@example.com' })
- const emptyInput = () => ({ name: '', email: '' })
- const invalidEmail = () => ({ email: 'not-an-email' })
测试里直接调用,比如 expect(validate(validUser())).toBe(true),既简洁又降低数据构造错误风险。


















