单元测试导出函数需确保模块导出与导入方式一致,优先导出纯命名函数,编写覆盖正常、边界及异常场景的用例,并通过 vi.fn() 或 vi.mock() 模拟外部依赖。

直接对导出函数做单元测试,核心是让测试文件能正确导入目标函数,并用断言验证其行为。关键不在“能不能测”,而在于“怎么导、怎么引、怎么验”三步是否对齐。
确认模块导出与导入方式一致
ES6 模块(export/import)和 CommonJS(module.exports/require)不能混用,否则 Jest 会报错(如 “Cannot use import statement outside a module”)。必须统一:
- 若源文件用
export function add() {...},测试文件就写import { add } from './math.js' - 若源文件用
module.exports = function add() {...},测试文件就写const add = require('./math') - Node.js v14+ 原生支持 ES 模块,但需在
package.json中声明"type": "module";否则默认按 CommonJS 解析
为可测性设计导出结构
避免把函数藏在副作用逻辑里,优先导出纯函数:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 导出命名函数(推荐):便于按需导入,也利于多人协作时明确接口
export const add = (a, b) => a + b;export const getMax = (arr) => arr?.length ? Math.max(...arr) : undefined; - 慎用默认导出:一个文件只能有一个
export default,不利于扩展多个工具函数 - 不导出依赖外部状态的函数(如直接操作
document或调用fetch),这类逻辑应抽离为参数或通过依赖注入传递
编写清晰、覆盖边界场景的测试用例
每个 test 或 it 应聚焦一个明确行为,用 expect 验证输出。常见模式:
- 正常输入:
expect(add(2, 3)).toBe(5) - 边界值:空数组、
null、负数、极大值等expect(getMax([])).toBeUndefined()expect(getMax([0, -10, 100])).toBe(100) - 异常路径:主动抛错时用
toThrowexpect(() => divide(5, 0)).toThrow('Division by zero')
需要时模拟外部依赖
如果函数内部调用了 API、定时器或 localStorage,测试时要隔离这些不稳定因素:
- 用
vi.fn()替换回调或工具函数:const mockCallback = vi.fn(); debounce(mockCallback, 100)(); vi.advanceTimersByTime(100); expect(mockCallback).toHaveBeenCalledTimes(1); - 用
vi.mock('./api.js')拦截整个模块,返回预设数据 - 测试完调用
vi.clearAllMocks(),防止测试间污染










