最常用方式是用 fake-indexeddb 配合 Jest,在内存中模拟完整 IndexedDB API,需在测试入口覆盖 global.indexedDB 并在 beforeEach 重置工厂实例以确保隔离,避免手动 mock 导致事件和事务逻辑遗漏。

JavaScript 中 Mock IndexedDB 最常用的方式是用 fake-indexeddb 配合 jest 或其他测试框架,它在内存中模拟完整 IndexedDB API 行为,无需真实浏览器环境,适合单元测试和 CI。
用 fake-indexeddb 替换全局 indexedDB
fake-indexeddb 提供一个兼容的内存版 indexedDB 实现。在测试入口(如 jest.setup.js)中覆盖全局对象即可:
- 安装依赖:npm install --save-dev fake-indexeddb
- 在测试初始化文件中写入:
const { IDBFactory } = require('fake-indexeddb');
global.indexedDB = new IDBFactory();
注意:需确保在任何业务代码引入前执行,否则会被原生 indexedDB 覆盖。
配合 Jest 清理数据库状态
每次测试后应清空 fake-indexeddb 的内存数据,避免测试间干扰:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
- 在 beforeEach 中调用 IDBFactory.prototype.deleteDatabase 删除所有库
- 或直接重置工厂实例(更彻底):
const { IDBFactory } = require('fake-indexeddb');
beforeEach(() => {
global.indexedDB = new IDBFactory();
});
这样每个测试都从干净的空数据库开始。
验证 Mock 是否生效
可在测试中快速确认是否成功接管:
- 检查 indexedDB.open 返回的是 IDBRequest 实例而非浏览器原生对象
- 尝试打开一个库并添加数据,再用 getAll() 读取,确认能正常增删查改
- 如果报错 "Failed to execute 'open' on 'IDBFactory': access is denied",说明未正确替换或被其他 polyfill 干扰
不推荐的手动 Mock 方式
直接用 jest.mock 模拟 indexedDB 对象容易漏掉大量异步事件(如 onsuccess、onupgradeneeded)、事务逻辑和游标行为,导致测试通过但实际运行失败。fake-indexeddb 是目前最接近真实行为的轻量级方案,无需修改业务代码,兼容性好。

















