jest тест не пройден после установки response-native-async-storage - PullRequest
4 голосов
/ 29 марта 2019

В моем собственном реактивном проекте я недавно установил узел-реактив-native-async-storage модуля узла, так как я получил предупреждения об устаревшем и переместил его в отдельный модуль.

После установки @react-native-community/async-storage мой шутник не проходит.

сначала со следующим error: unexpected token at position 0

в файле:

persistence.js

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
}

Итак, я предполагаю, что этосвязана с некоторой конфигурацией babel, так как я столкнулся с чем-то похожим в прошлый раз, когда я установил пакет из @ response-native-community

Итак, к transformIgnorePatterns в моем package.json я добавил следующее:

  "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)"
    ]
  }

Но теперь я получаю новую ошибку.@RNCommunity/AsyncStorage: NativeModule.RCTAsyncStorage is null.

Я вставляю скриншот, чтобы показать каталог моего проекта, чтобы вы могли понять, с какими конфигурационными файлами можно связываться.enter image description here

Как я вижу, большинство связанных тем касаются насмешки над функцией asyncStorage, которую я пытался сделать, но безуспешно.Я добавил следующее в свой единственный тестовый файл:

import MockAsyncStorage from 'mock-async-storage';

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

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

Все еще нет сигары.Я попытался добавить setupFilesAfterEnv.js с конфигурациями, как предполагает другой ответ, также не сработал.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2019

Я нашел способ издеваться над @react-native-community/async-storage

в корне моего проекта (тот же каталог, что и __test__ каталог), я создал структуру dir, например:

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

в index.js Я издевался над следующими функциями:

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)));
  },
}

в моем тестовом файле я добавил это:

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

Скриншот структуры dir: enter image description here

Это добилось цели. Я нашел вдохновение здесь: https://github.com/react-native-community/react-native-async-storage/issues/39

3 голосов
/ 29 марта 2019

Вам необходимо добавить этот фрагмент кода в файл 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(),
};
0 голосов
/ 07 июня 2019

Вот как исправить эту проблему:

  1. В корневом каталоге вашего проекта создайте каталог __ mocks __ / @ реагировать-нативное сообщество .
  2. Внутрив этой папке создайте файл async-storage.js .
  3. Скопируйте и вставьте в этот файл следующее:
export default from '@react-native-community/async-storage/jest/async-storage-mock'

Согласно документация .

На случай, если кто-то другой ищет это, как я.

...