javascript单元测试需清理内存状态缓存以避免测试间耦合:清空localstorage/sessionstorage、启用clearmocks或调用jest.clearallmocks()、删除service worker缓存及注销sw、重置自定义记忆化函数缓存。

在 JavaScript 单元测试中,清理每个测试的缓存不是指浏览器缓存,而是指测试运行期间可能被污染的内存状态——比如 localStorage、sessionStorage、Service Worker 缓存、自定义记忆化函数缓存、或第三方库(如 Axios、Jest mock)保留的模拟数据。若不清理,前一个测试留下的缓存会影响后续测试,导致“测试间耦合”和不可靠结果。
清理 localStorage 和 sessionStorage
这两个 Web API 是全局且持久的,同一测试文件中多个 test 会共享它们。推荐在每个测试前重置:
- 使用
beforeEach清空:
beforeEach(() => {<br> localStorage.clear();<br> sessionStorage.clear();<br>});
- 若只需清指定 key(更安全),可用
removeItem:
beforeEach(() => {<br> localStorage.removeItem('authToken');<br> sessionStorage.removeItem('cartId');<br>});
重置 Jest 的 mock 状态
Jest 的 mock 函数(jest.fn())、模块模拟(jest.mock())默认会在每个测试后自动重置——但前提是启用 clearMocks: true(推荐)或手动调用重置方法:
- 在
jest.config.js中开启:
module.exports = {<br> clearMocks: true,<br>};
- 或在
beforeEach中显式重置:
beforeEach(() => {<br> jest.clearAllMocks(); // 清除所有 mock 的调用记录和返回值<br> jest.resetModules(); // 重置模块缓存,确保 import 重新执行<br>});
清除 Service Worker 缓存(如使用 workbox 或 caches API)
若测试涉及 window.caches 或注册了 Service Worker,需主动删除缓存实例:
- 在
beforeEach中清理已知缓存名:
beforeEach(async () => {<br> if ('caches' in window) {<br> await caches.delete('my-app-cache-v1');<br> await caches.delete('my-api-cache');<br> }<br>});
- 如需注销 Service Worker(防止 activate 阶段干扰):
beforeEach(async () => {<br> if ('serviceWorker' in navigator) {<br> const registrations = await navigator.serviceWorker.getRegistrations();<br> await Promise.all(registrations.map(r => r.unregister()));<br> }<br>});
重置自定义缓存对象或记忆化函数
如果你在代码中实现了类似 memoize() 的函数,并暴露了 clear() 方法,应在每个测试前调用它:
- 假设你导出了一个带缓存控制的记忆化函数:
import { memoizedCalculate } from './utils';<br><br>beforeEach(() => {<br> memoizedCalculate.clear?.(); // 安全调用 clear 方法(如有)<br>});
- 若使用
Map或Object手动管理缓存,可在测试 setup 阶段重新初始化该缓存容器。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











