我有一個擴展EventEmitter的依賴類,我需要測試一個使用此依賴性的函數如何基於它觸發的事件作出反應。你如何存儲一個EventEmitter類的函數?存根ES6 EventEmitter類函數
相關性類
const EventEmitter = require('events');
class FooBar extends EventEmitter {
constructor() {
super();
this.doingSomething = false;
}
doSomething() {
if (this.doingSomething === false) {
this.doingSomething = true;
this.emit('startedDoingSomething');
}
else {
this.emit('alreadyDoingSomething');
}
}
}
module.exports = FooBar;
依賴被測模塊
let Foobar = require('FooBar');
let fooBar = new FooBar();
exports.myFunction =() => {
// Set up listeners
fooBar.once('startedDoingSomething',() => {
fooBar.removeAllListeners();
// Some functionality
console.log('Started Doing Something');
});
fooBar.once('alreadyDoingSomething',() => {
fooBar.removeAllListeners();
// Some functionality
console.log('Already Doing Something');
});
// Call the event-emitting function
fooBar.doSomething();
};
// Other functions that use fooBar
,以創建一個存根我使用興農,但我一直沒能存根可以有效地發射事件的類函數。我將我的測試建模爲[Feature request] stub emits,但必須進行一些修改,因爲事件發射器依賴項被截斷是一個類。
測試
let chai = require('chai');
let sinon = require('sinon');
let FooBar = require('FooBar');
let dependentModule = require('./dependentModule');
describe('Dependent Module',() => {
it('alreadyDoingSomething',() => {
sinon.stub(FooBar.prototype, 'pause',() => {
FooBar.prototype.emit('alreadyDoingSomething');
});
// Assertion statements here
expect(dependentModule.myFunction()).to...
});
});
這種方法實際上並沒有發出即使存根函數被調用的事件。
是的 - 第7行的removeAllListeners()調用是有意的,因爲它可以防止發生單個事件後myFunction掛起。在這個特殊情況下,我只關心已發出的第一個事件,但需要處理所有情況。 您建議的導出修復功能可以工作 - 即使沒有對removeAllListeners()調用進行註釋 - 但不幸的是,沒有辦法使這個工作只用構造函數而不是類的確切實例。 –