JS中测试依赖全局变量的函数需隔离依赖、可控模拟、还原环境:用Jest临时替换并恢复全局对象,或重构为可注入依赖,也可借助jsdom模拟浏览器上下文。

在 JS 中测试依赖全局变量(如 window、localStorage、document)的函数,核心思路是:**隔离依赖、可控模拟、还原环境**。不能让测试真实读写浏览器全局状态,否则会污染测试、不可靠、难复现。
用 Jest 模拟全局对象(推荐)
Jest 提供了 jest.mock() 和直接赋值的方式,但对全局对象更常用的是“临时替换 + 恢复”:
- 测试前保存原始引用(如
const originalLocalStorage = global.localStorage) - 用
jest.fn()或简易 mock 对象替换(如global.localStorage = { getItem: jest.fn(), setItem: jest.fn() }) - 运行被测函数,断言 mock 方法是否被正确调用(参数、次数)
- 测试后恢复原始对象(
global.localStorage = originalLocalStorage),或使用afterEach统一清理
封装全局访问为可注入依赖(更易测)
重构函数,把对全局对象的直接调用改为参数传入,提升可测试性:
// 改造前(难测)
function saveUser(name) {
localStorage.setItem('user', name);
}
// 改造后(易测)
function saveUser(name, storage = localStorage) {
storage.setItem('user', name);
}
// 测试时传入 mock
const mockStorage = { setItem: jest.fn() };
saveUser('Alice', mockStorage);
expect(mockStorage.setItem).toHaveBeenCalledWith('user', 'Alice');
用 jsdom 环境模拟完整浏览器上下文
如果函数深度依赖 document、window.location 等,可在 Jest 中启用 jsdom 环境(默认已支持):
- 确保
testEnvironment: 'jsdom'在 Jest 配置中(Create React App 默认启用) - 此时
document、window是真实可用的 DOM 对象,可操作元素、监听事件 - 注意:
localStorage在 jsdom 中默认存在但行为简化,需手动清空(localStorage.clear())避免跨测试污染
避免常见陷阱
不要在测试外修改全局对象而不还原 —— 否则会影响其他测试;不要只 mock 方法却不校验返回值 —— 比如 getItem 返回 null 还是字符串,可能影响逻辑分支;注意作用域和执行时机 —— 若函数在模块顶层就访问 window,需在 beforeEach 中提前 mock,否则导入时已读取。



















