7
votes

jest test échoue après l'installation de react-native-async-storage

Dans mon projet natif react, j'ai récemment installé le module de nœud react-native-async-storage car j'ai reçu des avertissements concernant le package natif de 'react-native' étant obsolète et déplacé vers un module individuel.

Après avoir installé le @react-native-community/async-storage mon test de plaisanterie échoue.

d'abord avec l' error: unexpected token at position 0 suivante error: unexpected token at position 0

dans le fichier:

persistence.js

import MockAsyncStorage from 'mock-async-storage';

beforeAll(() => { 
  const mockImpl = new MockAsyncStorage()
  jest.mock('AsyncStorage', () => mockImpl)
  snapshot = renderer.create(<App />);
})

afterAll(() => {
  jest.unmock('AsyncStorage')
});

Je suppose donc que cela est lié à une configuration de babel, car j'ai rencontré quelque chose de similaire la dernière fois que j'ai installé un package de la @ react-native-community

Donc, aux transformIgnorePatterns dans mon package.json, j'ai ajouté ce qui suit:

  "jest": {
    "preset": "react-native",
    "transformIgnorePatterns": [
      "node_modules/(?!react-native|@react-native-community/async-storage|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|tcomb-form-native)"
    ]
  }

Mais maintenant, j'obtiens une nouvelle erreur. @RNCommunity/AsyncStorage: NativeModule.RCTAsyncStorage is null.

Je colle la capture d'écran pour afficher le répertoire de mon projet afin que vous puissiez avoir une idée des fichiers de configuration disponibles. entrez la description de l'image ici

Comme je peux le voir, la plupart des sujets connexes concernent la moquerie de la fonction asyncStorage, j'ai essayé de le faire, sans aucune chance. J'ai ajouté ce qui suit à mon seul et unique fichier de tests:

import AsyncStorage from '@react-native-community/async-storage';

storeData = async ({ key, value }) => {
  try {
    await AsyncStorage.setItem(key, value);
  } catch (error) {
    // Error saving data
  }
}

retrieveData = async (key) => {
  try {
    const value = await AsyncStorage.getItem(key);
    if (value !== null) {
      // Our data is fetched successfully
      return value;
    }
  } catch (error) {
    // Error retrieving data
  }
}

module.exports = {
  storeData,
  retrieveData
}

Toujours pas de cigare. J'ai essayé d'ajouter un setupFilesAfterEnv.js avec des configurations comme le suggère une autre réponse, mais je n'ai pas non plus fait l'affaire.


0 commentaires

5 Réponses :


5
votes

Vous devez ajouter ce morceau de code à votre setupTestFrameworkScriptFile

    import { NativeModules } from 'react-native';
NativeModules.RNCAsyncStorage = {
  getItem: jest.fn(),
  setItem: jest.fn(),
  removeItem: jest.fn(),
  mergeItem: jest.fn(),
  clear: jest.fn(),
  getAllKeys: jest.fn(),
  flushGetRequests: jest.fn(),
  multiGet: jest.fn(),
  multiSet: jest.fn(),
  multiRemove: jest.fn(),
  multiMerge: jest.fn(),
};


5 commentaires

Hey! :) Quel fichier est mon setupTestFrameworkScriptFile? Où est-il situé ?


Voir ce lien jestjs.io/docs/en/configuration , si vous êtes maintenant sur Jest 24, cela devrait être setupFilesAfterEnv


Cela n'a pas fonctionné, mais l'erreur que je vois concerne @RNCommunity/AsyncStorage: NativeModule.RCTAsyncStorage is null. ce qui sonne un peu différent du RNCAsyncStorage auquel vous faites référence. Mon module est importé comme ceci: import AsyncStorage from '@react-native-community/async-storage';


Eh bien, si vous vérifiez le code source, vous pouvez voir que l'erreur provient de: const {NativeModules} = require ('react-native'); const RCTAsyncStorage = NativeModules.RNC_AsyncSQLiteDBStorage || NativeModules.RNCAsyncStorage; if (! RCTAsyncStorage) {throw new Error (`@ RNCommunity / AsyncStorage: NativeModule.RCTAsyncStorage est null. Donc, se moquer de l'un de ces deux dans votre test devrait le faire. github.com/react-native-community/react-native-async -stockage‌ /…


Eh bien, bon point. Mais j'ai confirmé que j'étais sur jst 24+ et j'ai ajouté setupFilesAfterEnv à la racine, comme le précise le document. Ne semble pas fonctionner sur le npm test ou le yarn test . Donc à la fin je suis retourné à la méthode simulée . qui a finalement fonctionné.



10
votes

J'ai trouvé un moyen de me moquer de la @react-native-community/async-storage

à la racine de mon projet, (même __test__ que __test__ dir), j'ai créé une structure dir comme celle-ci:

__mocks__/@react-native-community/async-storage/index.js

dans index.js, je me suis moqué des fonctions suivantes:

beforeAll(() => { 
  jest.mock('@react-native-community/async-storage');
})

dans mon fichier de test, j'ai ajouté ceci:

let cache = {};
export default {
  setItem: (key, value) => {
    return new Promise((resolve, reject) => {
      return (typeof key !== 'string' || typeof value !== 'string')
        ? reject(new Error('key and value must be string'))
        : resolve(cache[key] = value);
    });
  },
  getItem: (key, value) => {
    return new Promise((resolve) => {
      return cache.hasOwnProperty(key)
        ? resolve(cache[key])
        : resolve(null);
    });
  },
  removeItem: (key) => {
    return new Promise((resolve, reject) => {
      return cache.hasOwnProperty(key)
        ? resolve(delete cache[key])
        : reject('No such key!');
    });
  },
  clear: (key) => {
    return new Promise((resolve, reject) => resolve(cache = {}));
  },

  getAllKeys: (key) => {
    return new Promise((resolve, reject) => resolve(Object.keys(cache)));
  },
}

Capture d'écran de la structure du répertoire: entrez la description de l'image ici

Cela a fait l'affaire. J'ai trouvé l'inspiration ici: https://github.com/react-native-community/react-native-async-storage/issues/39


0 commentaires

14
votes

async-storage a publié des instructions sur la façon de résoudre ce problème.

Voici une version abrégée:

  1. Dans le répertoire racine de votre projet, créez le répertoire __mocks __ / @ react-native-community .
  2. Dans ce dossier, créez un fichier async-storage.js .
  3. Copiez collez ce qui suit dans ce fichier:
export default from '@react-native-community/async-storage/jest/async-storage-mock'
  1. Prendre plaisir!

J'espère que cela peut aider les autres.


4 commentaires

Le lien est 404 malheureusement


@typewriter Merci. J'ai mis à jour le lien


C'est __mocks__/ avec deux __mocks__/ de soulignement, pas un. Les instructions ont peut-être été mises à jour depuis que vous avez publié ceci, bien sûr. Mais juste pour info @FrancoisNadeau


@MattFletcher Merci. Je ne crois pas que les documents aient changé, c'était un problème de balisage avec ce que j'ai écrit.



1
votes

Modifier Ignorer ma réponse, faites simplement ceci à la place: https://github.com/react-native-community/async-storage/blob/LEGACY/docs/Jest-integration.md

Merci @Krizzo

Une autre version Jest basée sur @Rasmus Puls mais avec des fonctions Jest - à ajouter à votre fichier Jest Mocks.

jest.mock('@react-native-community/async-storage', () => { 
  let cache = {};
  return {
    setItem: jest.fn((key, value) => {
      return new Promise((resolve, reject) => {
        return (typeof key !== 'string' || typeof value !== 'string')
          ? reject(new Error('key and value must be string'))
          : resolve(cache[key] = value);
      });
    }),
    getItem: jest.fn((key, value) => {
      return new Promise((resolve) => {
        return cache.hasOwnProperty(key)
          ? resolve(cache[key])
          : resolve(null);
      });
    }),
    removeItem: jest.fn((key) => {
      return new Promise((resolve, reject) => {
        return cache.hasOwnProperty(key)
          ? resolve(delete cache[key])
          : reject('No such key!');
      });
    }),
    clear: jest.fn((key) => {
      return new Promise((resolve, reject) => resolve(cache = {}));
    }),
    getAllKeys: jest.fn((key) => {
      return new Promise((resolve, reject) => resolve(Object.keys(cache)));
    }),
  }
});


1 commentaires

Hé, pourquoi ne pas en utiliser un fourni dans le dépôt du stockage Async?



0
votes

Vous pouvez l'ajouter à votre fichier de test.

import React from "react";

jest.mock("@react-native-community/async-storage", () =>
  require("@react-native-community/async-storage/jest/async-storage-mock"),
);

describe("Example test", () => {
  it("should work", () => {
    ...
  });
});

Par exemple

jest.mock("@react-native-community/async-storage", () =>
  require("@react-native-community/async-storage/jest/async-storage-mock"),
);


0 commentaires