js单元测试速查手册:30秒定位解法——值相等用tobe,对象深比较用toequal,mock函数用jest.fn(),异步用resolves,react组件用rtl,必清mock、禁用tobe比对象、异步需await、测试名要具体。

编写 JS 单元测试速查手册,核心是聚焦高频场景、精简命令、突出易错点,让开发者 30 秒内找到“怎么测这个”。不是文档汇编,而是真实写测试时伸手就用的备忘单。
一、测试环境与基础断言(Jest 常用)
确保已安装 jest 并配置好 package.json 中的 "test" 脚本。常用断言直接对应典型需求:
-
值相等:
expect(sum(1, 2)).toBe(3)(严格相等,含null/undefined) -
对象/数组结构一致:
expect(getUser()).toEqual({ id: 1, name: 'Alice' })(深比较) -
函数是否被调用:
const mockFn = jest.fn(); fn(mockFn); expect(mockFn).toHaveBeenCalledTimes(1) -
异步函数:
await expect(fetchData()).resolves.toEqual({ ok: true })或用done()回调
二、模拟(Mock)关键写法
避免真实依赖干扰,只验证逻辑本身:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
模拟模块方法:
jest.mock('./api', () => ({ fetchUser: jest.fn().mockResolvedValue({ id: 1 }) })) -
临时模拟单个函数:
jest.mock('./utils', () => ({ getTime: () => '2024-01-01' })) -
还原 mock(防止测试间污染):
afterEach(() => { jest.clearAllMocks() }) -
模拟定时器:
jest.useFakeTimers(); setTimeout(() => {}, 1000); jest.runAllTimers();
三、覆盖常见函数类型
按函数特征快速套用模板:
- 纯函数(无副作用):直接传参断言返回值,无需 mock
-
带副作用函数(如调用 API、修改 DOM):mock 外部调用,用
mockImplementation控制返回,再验证输入/调用次数 -
React 组件(函数组件):用
@testing-library/react,render+screen.getByText+fireEvent.click,不测实现细节,测用户可见行为 -
高阶函数或闭包:先调用外层得到内层函数,再对内层做断言,例如
const adder = createAdder(5); expect(adder(3)).toBe(8)
四、避坑提醒(写完立刻检查)
这些错误在 PR 中最常被指出:
- 忘记清理 mock —— 加
beforeEach(jest.clearAllMocks)或启用clearMocks: trueinjest.config.js - 用
toBe比较对象/数组 —— 改用toEqual - 异步测试没
await或没returnpromise —— Jest 不会等待,导致断言失效 - 测试名含糊,如
it('works')—— 应明确行为:it('returns 0 when input is empty array' - 过度断言(比如校验内部变量、mock 的私有调用)—— 只测公共接口和可观测行为
手册保持一页以内,打印出来贴在显示器边框上就能用。重点不是全,而是准——每个条目都能解决一个你正卡住的问题。










