2017-07-07 100 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');