如何在React本机jest测试中模拟推送通知本机模块?

时间:2017-04-01 14:17:06

标签: javascript react-native mocking apple-push-notifications jestjs

使用模块react-native-push-notification时,出现此错误:

 FAIL  __tests__/index.android.js
  ● Test suite failed to run

    Invariant Violation: Native module cannot be null.

      at invariant (node_modules/fbjs/lib/invariant.js:44:15)
      at new NativeEventEmitter (node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js:32:1)
      at Object.<anonymous> (node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.js:18:29)
      at Object.get PushNotificationIOS [as PushNotificationIOS] (node_modules/react-native/Libraries/react-native/react-native.js:97:34)
      at Object.<anonymous> (node_modules/react-native-push-notification/component/index.ios.js:10:23)

我尝试通过创建__mocks__/react-native.js并将此代码放入其中来模拟该模块:

const rn = require('react-native')

jest.mock('PushNotificationIOS', () => ({
  addEventListener: jest.fn(),
  requestPermissions: jest.fn(),
  then: jest.fn()
}));

module.exports = rn

现在,我有这个错误:

 FAIL  __tests__/index.android.js
  ● Test suite failed to run

    TypeError: Cannot read property 'then' of null

      at Object.<anonymous>.Notifications.popInitialNotification (node_modules/react-native-push-notification/index.js:278:42)
      at Object.<anonymous>.Notifications.configure (node_modules/react-native-push-notification/index.js:93:6)
      at Object.<anonymous> (app/utils/localPushNotification.js:4:39)
      at Object.<anonymous> (app/actions/trip.js:5:28)

我怎么能以正确的方式完全模拟这个模块?

3 个答案:

答案 0 :(得分:3)

我通过创建设置文件PushNotificationIOS来模拟模块jest/setup.js

jest.mock('PushNotificationIOS', () => {
  return {
    addEventListener: jest.fn(),
    requestPermissions: jest.fn(() => Promise.resolve()),
    getInitialNotification: jest.fn(() => Promise.resolve()),
  }
});

我通过将此行添加到packages.json中来配置jest来运行此安装文件:

  "jest": {
    ...
    "setupFiles": ["./jest/setup.js"],
  }

答案 1 :(得分:1)

问题在于,在抛出错误的行中,lib尝试在react-native模块中调用getInitialNotification并期望返回某种结果的promise。所以你需要将这个函数添加到mock中,让它返回一个已解决的promise。

答案 2 :(得分:0)

[jest.config.js] [1]

您可以将“ react-native-push-notification-ios”直接放入tranformIgnorePatterns [1]:https://i.stack.imgur.com/PYbM5.png