我正在尝试对其中大量处理流的node-js模块之一进行单元测试。我正在尝试模拟一个流(我将要写入的流),因为在我的模块中,我想触发“.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”事件(并且.close()无效)。

我可以在流上找到的所有指南都使用'fs'或'net'库作为创建新流(https://github.com/substack/stream-handbook)的基础,或者他们使用sinon对其进行了模拟,但是模拟过程非常冗长且非常快速。

有没有提供这样的虚拟流的好方法?

最佳答案

而不是使用Push,我应该一直使用“.emit(,);”

我的模拟代码现在可以正常工作,看起来像:

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');

10-06 11:37