使用Jest和酶进行IndexedDB测试 - ReferenceError:indexedDB未定义

Mat*_*lak 5 javascript testing indexeddb jestjs enzyme

我正在寻找有关我的应用程序的单元测试的帮助,我正在使用indexedDB.在我实现indexedDB功能之前,测试是正确的.但是现在,对于所有这些我看到一个错误:

ReferenceError: indexedDB is not defined
Run Code Online (Sandbox Code Playgroud)

有人可以给我一个如何摆脱这个错误的建议吗?我正在搜索信息,并尝试不同的方式来模拟'window'或'indexedDB',但没有结果.

谢谢.

Seg*_*aab 10

使用jest时,根据fakeindexeddb文档,安装,

npm install --save-dev fake-indexeddb
Run Code Online (Sandbox Code Playgroud)

或者

yarn add --dev fake-indexeddb
Run Code Online (Sandbox Code Playgroud)

然后将以下代码添加到 jestconfig 文件中

"jest": {
    ...
    "setupFiles": [
        "fake-indexeddb/auto"
    ]
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*mas 7

这个问题是由于Dexie期望window.indexedDB被定义,在没有真正的DOM或window范围的无头模式(使用Jest)中运行时不是这种情况.

在Dexie git问题中找到了一个深层解决方案,它表明:

const Dexie = require('dexie')

Dexie.dependencies.indexedDB = require('fake-indexeddb')
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange')
Run Code Online (Sandbox Code Playgroud)

我们也取得了成功:

import Dexie from 'dexie';
import indexedDB from 'fake-indexeddb';

Dexie.dependencies.indexedDB = indexedDB;
Run Code Online (Sandbox Code Playgroud)

链接到原始问题: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 });
Run Code Online (Sandbox Code Playgroud)

链接到文档:http://dexie.org/docs/Dexie/Dexie


小智 6

如果您正在使用 jest 和酶来测试 indexdb,或者您正在使用 dexie 它是一个 indexDB 包装器,它也用于实现 indexDB api,您只需在 global-test.js 文件中添加这三行。

const Dexie = require('dexie');
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
Run Code Online (Sandbox Code Playgroud)

现在您必须将此文件提供给 jest,以表明它可以使用 fake-indexddb 而不是原始 indexDB。

setupFiles: ['<rootDir>/src/test/globals-test.ts']
Run Code Online (Sandbox Code Playgroud)