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

时间:2017-12-22 00:12:19

标签: javascript testing jestjs enzyme indexeddb

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

ReferenceError: indexedDB is not defined

有人可以给我一个如何摆脱这个错误的建议吗?我正在搜索信息,尝试不同的方式来模拟“窗口”或“索引的数据库”,但没有结果。

感谢。

4 个答案:

答案 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 });

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

答案 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使用。

相关问题