2015-10-15 43 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