闭包可为每个测试用例创建独立作用域以隔离 mock 数据状态:通过工厂函数返回封装私有数据(如 store、cookies)的 mock 对象,配合 beforeEach 重置确保零污染;校验逻辑亦可用闭包封装实现灵活配置;需避免闭包意外持有外部引用以防内存泄漏。

闭包能天然为每个测试用例创建独立的作用域,从而隔离 mock 数据状态——不需要全局变量或共享对象,每个测试都拥有自己的一套私有数据副本。
用工厂函数为每个测试生成专属闭包
把 mock 数据(如 localStorage 的 store、cookie 的键值对)定义在工厂函数内部,返回的 mock 对象只访问该次调用产生的私有状态:
- 每次调用工厂函数都会新建一个空的
store = {}或cookies = {} - 返回的
getItem/setItem方法通过闭包引用这个局部对象,彼此完全不干扰 - 避免在
beforeAll中初始化共享 mock,改用beforeEach调用工厂函数
配合 Jest/Vitest 实现零污染重置
在 beforeEach 中重新绑定 mock,确保上一个测试留下的数据不会影响下一个:
- Jest 示例:
beforeEach(() => { Object.defineProperty(window, 'localStorage', { value: createLocalStorageMock() }); }); - Vitest 示例:
beforeEach(() => { vi.stubGlobal('localStorage', createLocalStorageMock()); }); -
createLocalStorageMock()每次返回新对象,内部store是全新空对象
校验逻辑也走闭包封装,支持灵活配置
权限校验、API 响应规则等可变逻辑,同样适合用闭包封装后传入测试:
立即学习“Java免费学习笔记(深入)”;
- 例如
createPermissionChecker({ roles: ['admin'] })返回一个闭包函数,其roles数组是私有的 - 测试中可为不同用例创建不同配置的 checker,互不影响
- 便于模拟用户角色切换、白名单变更等边界场景
避免闭包意外持有外部引用
虽然闭包隔离了状态,但若误将大对象、DOM 节点或全局实例传入,仍可能造成内存泄漏或测试污染:
- 不要在闭包内直接引用
window、document或测试框架的上下文对象(如jest) - mock 函数中避免使用箭头函数捕获外部变量,除非明确需要
- 测试结束后,可主动设
mockFn.mockReset()或清空闭包内缓存(如cache.clear())


















