我正在寻找有关我的应用程序的单元测试的帮助,我在那里使用了indexedDB。在我实现indexedDB功能之前,测试是正确的。但是现在,对于他们所有人我看到一个错误:
ReferenceError: indexedDB is not defined
有人可以给我一个如何摆脱这个错误的建议吗?我正在搜索信息,尝试不同的方式来模拟“窗口”或“索引的数据库”,但没有结果。
感谢。
答案 0 :(得分:7)
这个问题是由于Dexie期望定义window.indexedDB
,在没有真正的DOM或window
范围的无头模式(使用Jest)中运行时不是这种情况。 / p>
在Dexie git问题中找到了一个深层次的解决方案,这表明:
const Dexie = require('dexie')
Dexie.dependencies.indexedDB = require('fake-indexeddb')
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange')
我们也取得了成功:
import Dexie from 'dexie';
import indexedDB from 'fake-indexeddb';
Dexie.dependencies.indexedDB = indexedDB;
链接到原始问题: https://github.com/dfahlander/Dexie.js/issues/495
或者根据文档,您可以提供indexedDB选项,如:
import Dexie from 'dexie';
import indexedDB from 'fake-indexeddb';
var db = new Dexie("MyDatabase", { indexedDB: indexedDB });
答案 1 :(得分:0)
对于带有玩笑的Angular 7.3+,请将其添加到您的global-test.ts文件中:
const Dexie = require('dexie');
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
然后将文件加载到jest.config.js中:
module.exports = {
preset: 'jest-preset-angular',
transformIgnorePatterns: ['node_modules'],
setupTestFrameworkScriptFile: '<rootDir>/src/setupJest.ts',
moduleNameMapper: {
'\\.(jpg|jpeg|png)$': '<rootDir>/__mocks__/image.js',
'@lib/(.*)': '<rootDir>/src/lib/$1'
},
globals: {
'ts-jest': {
tsConfigFile: 'src/tsconfig.spec.json'
},
__TRANSFORM_HTML__: true
},
setupFiles: ['<rootDir>/src/test/globals-test.ts']
};
答案 2 :(得分:0)
如果您使用笑话和酶来测试indexdb,或者使用的dexie是indexDB包装器,也用于实现indexDB api,则只需在global-test.js文件中添加这三行。 >
select date(dt), sum(is_video_prize) as total_video_prize,
sum(is_video_stock) as total_video_stock
from ((select last_video_watched as dt, 1 as is_video_prize, 0 as is_video_stock
from video_ads_user_historic
) union all
(select date_when_transacted as dt, 0, 1
from stock_historic
where has_seen_video_ad = true
)
) vp
group by date(dt)
order by date(dt);
现在,您必须将此文件提供给用户开玩笑,表明它可以使用false-indexddb代替原始的indexDB。
const Dexie = require('dexie');
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
答案 3 :(得分:0)
我不使用Dexie(而是在Firebase对导入提出期望时才来到这里),此修复程序只是将require('fake-indexeddb/auto')
添加到setupTests.ts
中以供Jest使用。