Wie mock-streams in NodeJS
Ich versuche, unit-Tests einer meiner node-js-Module, die sich stark in strömen. Ich versuche zu verspotten, einen stream (die ich schreib), wie in meinem Modul habe ich ".auf('data/Ende)" zu-Hörer möchte ich gerne auslösen. Im wesentlichen möchte ich in der Lage sein, so etwas zu tun:
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();
Diese führt, aber der " on " - Ereignis wird nie ausgelöst nachdem ich die push und .close() ist ungültig).
Alle Hinweise, die ich finden kann auf streams verwendet das 'fs' oder 'net' Bibliothek als Grundlage für das erstellen eines neuen Streams (https://github.com/substack/stream-handbook), oder Sie verspotten ihn mit sinon aber der Spott wird sehr lange sehr quicky.
Ist es ein schöner Weg, um eine dummy-stream so?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt mit Push, ich hätte mit ".emittieren(<Fall>, <Daten>);"
Meiner Pseudo-code funktioniert nun und sieht wie folgt aus:
new require('stream').Readable()
(Hinweis Hauptstadt R)Den accept-Antwort ist nur teilweise richtig. Wenn alles, was Sie brauchen, ist, Ereignisse zu feuern, mit
.emit('data', datum)
ist okay, aber wenn Sie brauchen, um Rohr diese mock-stream überall sonst funktioniert es nicht.Spott einen Lesbaren stream ist überraschend einfach, erfordert nur die Lesbaren lib.
Jetzt können Sie Rohr diese stream, wo und 'Daten' und 'Ende' wird Feuer.
Weiteres Beispiel aus der Knoten-docs:
https://nodejs.org/api/stream.html#stream_an_example_counting_stream
Gibt es einen einfacheren Weg:
stream.PassThrough
Habe ich gerade gefunden, der Knoten ist sehr leicht zu übersehen
stream.PassThrough
- Klasse, die ich glaube, ist, was Sie suchen.Vom Knoten docs:
link zu Google docs
Den code aus der Frage geändert:
mockedStream.push()
funktioniert auch, aber alsBuffer
so dass Sie möglicherweise tun möchten:console.dir(d.toString());
Gebäude auf @flacnut 's Antwort, ich habe diese (in NodeJS 12+) mit
Readable.from()
zu konstruieren stream vorab mit Daten (Liste der Dateinamen):In meinem Fall wollte ich verspotte die stream-Dateinamen zurückgegeben, die von fast-glob.stream:
In der Funktion erprobt:
Funktioniert wie ein Charme!