2015-10-15 42 views
4

我试图单元测试我的一个node-js模块,它在流中大量处理。我试图模拟一个流(我将写入),因为在我的模块中我有“.on('data/end)”我想要触发的侦听器。基本上我希望能够做这样的事情:如何在NodeJS中模拟流

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

此执行,但之后我做推(和.close()是无效的)的“关于”事件永远不会被解雇。

我可以在流上找到的所有指导都使用'fs'或'net'库作为创建新流的基础(https://github.com/substack/stream-handbook),或者他们用sinon嘲笑它,但嘲笑变得非常漫长非常快。

有没有一种很好的方式来提供这样的虚拟流?

回答

8

而不是使用推的,我一直在使用 “.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'); 
+0

校正:'新要求( '流')可读()'(请注意资本R) – Jonny

+0

需要不是一个构造,这将工作的w/o。新的关键字 – Spets

1

的接受答案只有部分正确。如果你所需要的只是需要触发的事件,那么使用.emit('data', datum)就没问题,但如果你需要在其他任何地方管这个模拟流,它将无法工作。

模拟可读流是非常容易的,只需要Readable lib。

let eventCount = 0; 
    const mockEventStream = new Readable({ 
    objectMode: true, 
    read: function (size) { 
     if (eventCount < 10) { 
     eventCount = eventCount + 1; 
     return this.push({message: `event${eventCount}`}) 
     } else { 
     return this.push(null); 
     } 
    } 
    }); 

现在你可以在任何地方管这个流,'data'和'end'将会触发。

从节点文档又如: https://nodejs.org/api/stream.html#stream_an_example_counting_stream