2 Stimmen

Einheitstests mit Streams in C#

Ich habe einige Client-Code, der mit einem Server mit Streams kommuniziert, die ich testen möchte. Ich möchte testen, ob der Client die richtigen Befehle an den Server sendet.

Zu diesem Zweck habe ich eine Connect-Methode erstellt, die zwei Streams akzeptiert: einen, aus dem der Client liest, und einen, in den der Client schreibt. Ich kann dann beide mit einem MemoryStream versorgen und die Befehle lesen, die von dem MemoryStream gesendet werden, in den der Client schreibt.

Mein Problem ist, dass ich eine Methode kodieren muss, die erfordert, dass diese beiden Ströme gleich sind. Ich habe auch festgestellt, dass ich nur dann zwei verschiedene Streams verwenden muss, wenn ich den Client testen möchte. Daher möchte ich die Connect-Methode so umgestalten, dass sie nur einen Stream verwendet, in den geschrieben und aus dem gelesen wird.

Ich kann keinen MemoryStream an diese Methode übergeben, da die Write-Methode in ein internes Byte-Array schreibt, aus dem die Read-Methode ebenfalls liest. Wenn ich dies einem Client übergebe, kann er die Befehle lesen, die er gerade gesendet hat!

Daher möchte ich fragen, welche Stream-Einrichtung dies leisten kann? Ich möchte einfach einen Stream, der von einer Quelle liest, aber in eine andere schreibt. Ich bräuchte Zugriff auf beide Quellen, damit der "Server", der mein Test ist, die richtigen Antworten auf Befehle senden und die vom Client gesendeten Befehle lesen kann.

Im Wesentlichen benötige ich zwei Ströme: S1 und S2. Ein Stream wird an den Client, der andere an den Server gegeben.
Die Lesemethode von S1 ist mit der Schreibmethode von S2 "verbunden" => S1 liest, was S2 schreibt.
Die Schreibmethode von S1 ist mit der Lesemethode von S2 "verbunden" => S2 liest, was S1 schreibt.
Dies ist der Normalfall, wenn ein Client mit einem Server kommuniziert. Hier möchte ich es nur im Speicher tun. Wie kann ich das codieren?

5voto

Dave D Punkte 7888

Warum sollte man nicht das Senden der Befehle vom Transport der Befehle abstrahieren?

Damit meine ich, dass es eine Klasse gibt, die entscheidet, welche Befehle gesendet werden müssen, und eine andere, die die Art und Weise vorgibt, in der sie gesendet werden. Auf diese Weise können Sie testen, ob die Befehlsklasse die richtigen Befehle (in der richtigen Reihenfolge) generiert, indem Sie die Transportklasse mocken, ohne sich jemals um die Implementierungsdetails von Streams kümmern zu müssen.

Die Implementierung der Transportklasse würde dann einfach die ihr übergebenen Daten nehmen und sie direkt in den Stream schreiben, den sie normalerweise verwenden würde, ohne dass Sie sich Gedanken darüber machen müssten, wie das mit den Tests der Befehlsklasse funktioniert. Diese Klasse wäre schwieriger zu testen, aber zu diesem Zeitpunkt haben Sie festgestellt, dass die richtigen Befehle generiert werden, so dass es Integrationstests sind, um sicherzustellen, dass sie erfolgreich geschrieben werden.

3voto

R. Martinho Fernandes Punkte 217895

Sie können eine Unterklasse von Stream erstellen, die zwei andere Streams im Konstruktor aufnimmt und dann die Read y Write Methoden zum Lesen und Schreiben in den richtigen Streams.

Lesen Sie unbedingt die Hinweise für die Durchführenden Abschnitt auf der MSDN-Seite für die Stream Klasse.

0voto

fejesjoco Punkte 11539

Sie können einen bidirektionalen Stream erstellen, der zwei Speicherströme kapselt. Sie lesen von einem und schreiben in den anderen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X