Ich muss einen Komponententest für eine Methode schreiben, die einen Stream verwendet, der aus einer Textdatei stammt. Ich würde gerne so etwas machen:
Stream s = GenerateStreamFromString("a,b \n c,d");
c#
unit-testing
string
stream
Omu
quelle
quelle
StringReaderStream
unter stackoverflow.com/a/55170901/254109Antworten:
Vergessen Sie nicht, Using zu verwenden:
Über das
StreamWriter
nicht entsorgt werden.StreamWriter
ist nur ein Wrapper um den Basis-Stream und verwendet keine Ressourcen, die entsorgt werden müssen. DieDispose
Methode schließt den BasiswertStream
, in den geschriebenStreamWriter
wird. In diesem FallMemoryStream
möchten wir das zurückgeben.In .NET 4.5 gibt es jetzt eine Überlastung
StreamWriter
, die den zugrunde liegenden Stream offen hält, nachdem der Writer entsorgt wurde. Dieser Code macht jedoch dasselbe und funktioniert auch mit anderen .NET-Versionen.Siehe Gibt es eine Möglichkeit, einen StreamWriter zu schließen, ohne seinen BaseStream zu schließen?
quelle
GenerateStreamFromString
Methode verwenden Sie das Using nicht mit dem StreamWriter. Gibt es einen Grund dafür?StreamWriter
macht wahrscheinlich sowieso das, was du intern gesagt hast. Der Vorteil ist die Kapselung und der einfachere Code, jedoch auf Kosten der Abstraktion von Dingen wie dem Wegcodieren. Es hängt davon ab, was Sie erreichen wollen.Eine andere Lösung:
quelle
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
wenn Sie die Stückliste am Anfang des Streams haben müssennew MemoryStream( value, false )
. Sie können einen Stream nicht schreibgeschützt machen, wenn Sie ihn mit einem Stream-Writer schreiben müssen.Fügen Sie dies einer Dienstprogrammklasse für statische Zeichenfolgen hinzu:
Dies fügt eine Erweiterungsfunktion hinzu, so dass Sie einfach:
quelle
StreamWriter
. Das Update bestand darin, einen anderen Konstruktor zu verwenden - einen, mit dem ich LeaveOpen angeben konnte .quelle
Verwenden Sie die
MemoryStream
Klasse und rufen SieEncoding.GetBytes
auf, um Ihre Zeichenfolge zuerst in ein Array von Bytes umzuwandeln.Benötigen Sie anschließend eine
TextReader
im Stream? In diesem Fall können Sie eineStringReader
direkt angebenMemoryStream
und dieEncoding
Schritte und umgehen .quelle
Ich habe eine Mischung aus Antworten wie diesen verwendet:
Und dann benutze ich es so:
quelle
Wir verwenden die unten aufgeführten Erweiterungsmethoden. Ich denke, Sie sollten den Entwickler dazu bringen, eine Entscheidung über die Codierung zu treffen, damit weniger Magie involviert ist.
quelle
return ToStream(s, Encoding.UTF8);
. In der aktuellen Implementierung (return s.ToStream(Encoding.UTF8);
ist der Entwickler gezwungen,s == null
genauer nachzudenken, um den Code zu erfassen, und es scheint, dass der Fall von unbehandelt ist und wirftNullReferenceException
.Bitte schön:
quelle
Modernisierte und leicht modifizierte Version der Erweiterungsmethoden für
ToStream
:Änderung wie in @ Palecs Kommentar zur Antwort von @Shaun Bowe vorgeschlagen.
quelle
Ich denke, Sie können von der Verwendung eines MemoryStream profitieren . Sie können es mit den Zeichenfolgenbytes füllen, die Sie mithilfe der GetBytes- Methode der Encoding-Klasse erhalten .
quelle
Wenn Sie die Codierung ändern müssen, stimme ich für die Lösung von @ShaunBowe . Aber jede Antwort hier kopiert die gesamte Zeichenfolge mindestens einmal im Speicher. Die Antworten mit
ToCharArray
+BlockCopy
Combo machen es zweimal.Wenn das wichtig ist, gibt es hier einen einfachen
Stream
Wrapper für den rohen UTF-16-String. Bei Verwendung mit einerStreamReader
AuswahlEncoding.Unicode
dafür:Und hier ist eine vollständigere Lösung mit den erforderlichen gebundenen Prüfungen (abgeleitet von
MemoryStream
diesenToArray
undWriteTo
Methoden).quelle
Eine gute Kombination von String-Erweiterungen:
quelle