2017-07-07 103 views
4

我正在使用Jest和Enzyme进行测试。我在测试正常事件时没有问题,但我正在努力寻找正确的方法来触发和测试来自本机模块的组件中的事件。在我的Jest设置我有以下内容:测试自定义事件react-native

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(“按”)等,但对于自定义事件,我努力理解我是多么内处理这测试。

回答

0

我也想这样做,并且我设法在反应原生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');