【问题标题】:Testing custom events react-native测试自定义事件 react-native
【发布时间】:2017-12-11 06:26:36
【问题描述】:

我正在使用 Jest 和 Enzyme 进行测试。我测试正常事件没有问题,但我正在努力寻找正确的方法来触发和测试来自 Native Modules 的组件中的事件。在我的 Jest 设置中,我有以下内容:

jest.mock('NativeEventEmitter', () => class MockNativeEventEmitter{
  addListener = () => jest.fn()
  removeListener = () => jest.fn()
  removeAllListeners = () => jest.fn()
});

但是,我不确定在测试中我是如何实际调度事件的。因此,例如,当用户摇动设备时,我有一个 Native 模块。在组件本身内部是这样设置的:

shakeEvents: ['shaken],
deviceShakeEmitter: {},

componentDidMount() {
  this.deviceShakeEmitter = new NativeEventEmitter(Shake)
  this.deviceShakeEmitter.addListener('shaken', this['shaken'])
 },

我知道对于内置事件,我可以使用 jest.simulate('press') 等,但对于自定义事件,我很难理解如何在测试中处理这个问题。

【问题讨论】:

    标签: react-native jestjs


    【解决方案1】:

    我也想这样做,我设法在 react-native Github 存储库中找到了解决方案。他们使用普通的 JS EventEmitter 来模拟 NativeEventEmitter:

    const EventEmitter = require('EventEmitter');
    const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
    
    /**
     * Mock the NativeEventEmitter as a normal JS EventEmitter.
     */
    class NativeEventEmitter extends EventEmitter {
      constructor() {
        super(RCTDeviceEventEmitter.sharedSubscriber);
      }
    }
    

    现在您只需要设置模拟,并实例化此发射器以发送您喜欢的任何事件:

    jest.mock('NativeEventEmitter');
    
    const nativeEmitter = new NativeEventEmitter();
    nativeEmitter.emit('SomeEventYouListenTo');
    

    【讨论】:

    • 我刚刚浏览了 react-native 源代码以了解有关 NativeEventEmitter 的更多信息
    • 是否有可能是其中一位 OP 或其他人向我解释更多?模拟去哪里了?开玩笑的设置文件?
    • @JanithaR 我只是创建一个文件夹,在其中为每个模拟服务添加一个文件。只需将其导入您的测试文件并实例化。这里没有魔法。
    猜你喜欢
    • 2021-04-24
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2017-12-30
    • 2021-01-31
    • 2016-01-26
    相关资源
    最近更新 更多