21

ストリームを大量に扱うノード js モジュールの 1 つを単体テストしようとしています。モジュール内にトリガーしたい「.on('data/end)」リスナーがあるため、(書き込み先の) ストリームをモックしようとしています。基本的に、私はこのようなことをしたいと思っています:

var mockedStream = new require('stream').readable();

mockedStream.on('data', function withData('data') {
  console.dir(data);
});

mockedStream.on('end', function() { 
  console.dir('goodbye');
});

mockedStream.push('hello world');
mockedStream.close();

これは実行されますが、プッシュを実行した後に「on」イベントが発生することはありません (.c​​lose() は無効です)。

ストリームで見つけることができるすべてのガイダンスは、新しいストリーム ( https://github.com/substack/stream-handbook ) を作成するための基礎として「fs」または「net」ライブラリを使用するか、sinon でモックアウトしますが、嘲笑は非常に長くなり、非常に速くなります。

このようなダミー ストリームを提供する良い方法はありますか?

4

4 に答える 4

21

Push を使用する代わりに、".emit(<event>, <data>);" を使用する必要がありました。

私のモックコードは動作し、次のようになります。

var mockedStream = new require('stream').Readable();
mockedStream._read = function(size) { /* do nothing */ };

myModule.functionIWantToTest(mockedStream); // has .on() listeners in it

mockedStream.emit('data', 'Hello data!');
mockedStream.emit('end');
于 2015-10-15T16:46:45.347 に答える