我正在尝试对其中大量处理流的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');