在 jest 中 mock localstorage/sessionstorage 应用 object.defineproperty 劫持 window 属性,每次测试前创建新存储对象以隔离状态,并手动触发 storage 事件、确保类型与遍历行为一致。

在 Jest 等测试环境中 Mock localStorage 和 sessionStorage,核心是**用可重置、带事件支持的内存对象替换原生实例**,而不是简单赋值或打桩。JSDOM 虽提供基础实现,但默认不支持 storage 事件触发、跨测试隔离差,必须主动接管。
为什么不能直接写 global.localStorage = {}
JSDOM 在环境初始化时已创建 window.localStorage 实例,后续对 global 的赋值不会影响 window 上的引用。必须在 window 存在后,通过 Object.defineProperty 劫持属性。
推荐做法:在 setupFilesAfterEnv 中注入可重置 Mock
新建 tests/jest-setup-storage.js:
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
const createStorageMock = () => {
let store = {};
return {
setItem(key, value) {
store[key] = String(value);
window.dispatchEvent(new StorageEvent('storage', { key, newValue: value }));
},
getItem(key) { return store[key] ?? null; },
removeItem(key) { delete store[key]; },
clear() { store = {}; },
key(index) { return Object.keys(store)[index] || null; },
get length() { return Object.keys(store).length; }
};
};
if (typeof window !== 'undefined') {
Object.defineProperty(window, 'localStorage', {
value: createStorageMock(),
writable: true,
configurable: true
});
Object.defineProperty(window, 'sessionStorage', {
value: createStorageMock(),
writable: true,
configurable: true
});
}
配置 Jest 加载该文件
在 jest.config.js 中添加:
module.exports = {
setupFilesAfterEnv: ['
testEnvironment: 'jsdom'
};
关键细节必须注意
- 每个测试前自动重置:靠
createStorageMock()每次返回新对象,避免测试间状态污染 - storage 事件要手动触发:原生行为是其他窗口修改时当前窗口收到事件,Mock 中需显式
dispatchEvent - 类型安全:
setItem强制转字符串,getItem返回null(非undefined),与真实 API 一致 - 支持遍历:实现
key()和length,方便调试和工具函数使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










