15 votes

Test de l'indexedDB avec Jest et enzyme - ReferenceError : indexedDB is not defined

Je cherche de l'aide pour les tests unitaires de mon application, où j'utilise la base de données indexée. Avant que j'implémente la fonctionnalité indexedDB, les tests étaient corrects. Mais maintenant, pour chacun d'entre eux, je vois une erreur :

ReferenceError: indexedDB is not defined

Quelqu'un peut-il me conseiller sur la façon de se débarrasser de cette erreur ? J'ai cherché des informations, et j'ai essayé différentes façons de simuler 'window' ou 'indexedDB', mais sans résultat.

Merci.

18voto

Phillip Thomas Points 1142

Ce numéro est dû à Dexie qui attend window.indexedDB à définir, ce n'est pas le cas lorsqu'on fonctionne dans un mode sans tête (en utilisant Jest) qui n'a pas de véritable DOM ou de window l'étendue.

J'ai trouvé une solution dans les problèmes git de Dexie qui suggère :

const Dexie = require('dexie')

Dexie.dependencies.indexedDB = require('fake-indexeddb')
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange')

Nous avons également eu du succès avec :

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

Dexie.dependencies.indexedDB = indexedDB;

Lien vers le numéro original : https://github.com/dfahlander/Dexie.js/issues/495

Ou selon la documentation, vous pouvez fournir l'option indexedDB comme :

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

var db = new Dexie("MyDatabase", { indexedDB: indexedDB });

Lien vers la documentation : http://dexie.org/docs/Dexie/Dexie

0 votes

Est-ce que quelqu'un sait quand on a besoin de la FDBKeyRange (par opposition à la simple indexedDB ?

8voto

Alok Kumar Points 11

Si vous utilisez jest et enzyme pour tester indexdb ou si vous utilisez dexie qui est un wrapper d'indexDB qui est aussi utilisé pour implémenter l'api d'indexDB, vous devez juste ajouter ces trois lignes dans votre fichier global-test.js.

const Dexie = require('dexie');
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');

Maintenant vous devez fournir ce fichier à jest, pour montrer qu'il peut utiliser fake-indexddb au lieu de l'indexDB original.

setupFiles: ['<rootDir>/src/test/globals-test.ts']

1voto

dain Points 4393

Je n'utilise pas Dexie (mais je suis arrivé ici lorsque Firebase lançait une attente à l'importation), la solution consistait à ajouter simplement require('fake-indexeddb/auto') en setupTests.ts pour que Jest le prenne.

0voto

David Dehghan Points 1047

Pour Angular 7.3+ avec jest, ajoutez ceci à votre fichier global-test.ts :

const Dexie = require('dexie');
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');

puis charger le fichier dans 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']
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X