React Native, Invariant Violation: собственный модуль не может быть нулевым.(указывая на модуль OneSignal) - PullRequest
0 голосов
/ 02 июня 2018

Я пишу тесты с Jest + Enzyme для нативного приложения, которое использует OneSignal.

Здесь есть похожая проблема (я думаю): https://github.com/facebook/jest/issues/2208, но эта проблема довольно старая, и я следовал там решениям, но ни одна не работала для меня.

Сначала я столкнулся с этой ошибкой при запуске jest:

home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native-onesignal/index.js:4
    import { NativeModules, NativeEventEmitter, NetInfo, Platform } from 'react-native';
    ^^^^^^

    SyntaxError: Unexpected token import

    > 1 | import OneSignal from 'react-native-onesignal';
      2 | 
      3 | export const STORE_TIMEFRAME = 'STORE_TIMEFRAME';
      4 | export const STORE_TIMEFRAMES = 'STORE_TIMEFRAMES';

      at ScriptTransformer._transformAndBuildScript (../../../../../usr/lib/node_modules/jest-cli/node_modules/jest-runtime/build/script_transformer.js:316:17)
      at Object.<anonymous> (src/actions/subscription.js:1:387)
      at Object.<anonymous> (src/reducers/subscription.js:1:402)

Так что я продолжил и добавил react-native-onesignal к package.json как таковой:

"transformIgnorePatterns": [
      "node_modules/(?!(react-native-onesignal|react-native-login|react-native-elements)/)"
    ]

Так что решилмоя проблема.Но тут возникает другая проблема:

 Invariant Violation: Native module cannot be null.

    > 1 | import OneSignal from 'react-native-onesignal';
      2 | 
      3 | export const STORE_TIMEFRAME = 'STORE_TIMEFRAME';
      4 | export const STORE_TIMEFRAMES = 'STORE_TIMEFRAMES';

      at invariant (node_modules/fbjs/lib/invariant.js:42:15)
      at new NativeEventEmitter (node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js:37:31)
      at Object.<anonymous> (node_modules/react-native-onesignal/index.js:9:33)

Я пытался насмехаться OneSignal, но вот что происходит, когда я это делаю:

 Cannot find module 'OneSignal' from 'Main.test.js'

    > 1 | import React from 'react'
      2 | import { shallow } from '../../jest-setup'
      3 | import configureStore from 'redux-mock-store'
      4 | import OneSignal from 'react-native-onesignal'

      at Resolver.resolveModule (../../../../../usr/lib/node_modules/jest-cli/node_modules/jest-resolve/build/index.js:169:17)
      at Object.<anonymous> (src/__tests__/Main.test.js:1:108)

Я был измотан этой проблемойчасами!Любое понимание будет очень ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Так что получается, что мой макет был неправильным.Это должно быть:

jest.mock('react-native-onesignal', () => ({
  addEventListener: jest.fn(),
  removeEventListener: jest.fn(),
  inFocusDisplaying: jest.fn()
}))

, как указано в этой теме: https://github.com/facebook/jest/issues/6382#issuecomment-394104956

0 голосов
/ 02 июня 2018

Я думаю, что вам не хватает вавилонской шутки в качестве зависимости.Jest не использует babel по умолчанию и поэтому не понимает синтаксис импорта ES6.

Редактировать: Я также думаю, что есть еще одна проблема, вам также нужно будет смоделировать NativeEventEmitter из Reaction-native.Это может помочь, если вы также добавите код, который пытаетесь протестировать.

...