javascript - 如何在 React native Jest 测试中模拟推送通知 native 模块?

标签 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)

我如何才能以正确的方式完全模拟这个模块?

最佳答案

我通过创建一个安装文件 jest/setup.js 来模拟模块 PushNotificationIOS:

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

关于javascript - 如何在 React native Jest 测试中模拟推送通知 native 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157979/

相关文章:

javascript - 通过 JSPM 加载(自定义)模块

javascript - 获取重定向到该页面的 URL

c# - 根据其他方法输入返回一个值

reactjs - 在wix react native navigation V2中如何将数据从一个屏幕传递到另一个

unit-testing - MOCKITO:它是什么以及它与 Junit 有何不同

reactjs - 如何在测试中手动模拟 Svg?

javascript - 如何将这个变量传递给这个函数?

javascript - 将 forEach 循环附加到页面时遇到问题

react-native - React Native redux saga 产量不适用于第一个操作

react-native - 如何通过 React Native Web 使用 react-navigation 设置文档标题?