私は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
スタブを作成するために私がSinonを使用していますが、私は、スタブすることができていません効果的にイベントを発生させるクラス関数です。私は[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()呼び出しは意図的です.1つのイベントが発生した後にmyFunctionがハングしないようにするためです。この特定のケースでは、発行されたがすべてのケースを処理する必要がある最初のイベントについてのみ気にします。 removeAllListeners()の呼び出しをコメントしなくても、提案されたエクスポートの修正が機能しますが、クラスのインスタンスではなくコンストラクタだけでこの作業を行う方法がないことは残念です。 –