Muszę napisać test jednostkowy dla metody, która pobiera strumień pochodzący z pliku tekstowego. Chciałbym zrobić coś takiego:
Stream s = GenerateStreamFromString("a,b \n c,d");
c#
unit-testing
string
stream
Omu
źródło
źródło
StringReaderStream
w stackoverflow.com/a/55170901/254109Odpowiedzi:
Nie zapomnij użyć przy użyciu:
O
StreamWriter
niezbywaniu.StreamWriter
jest tylko opakowaniem wokół strumienia podstawowego i nie wykorzystuje żadnych zasobów, które należy usunąć.Dispose
Metoda zamknie instrumentu bazowegoStream
, któryStreamWriter
pisze do. W takim przypadkuMemoryStream
chcemy wrócić.W .NET 4.5 występuje teraz przeciążenie,
StreamWriter
które utrzymuje otwarty strumień źródłowy po usunięciu programu piszącego, ale ten kod robi to samo i działa również z innymi wersjami .NET.Zobacz Czy jest jakiś sposób na zamknięcie StreamWriter bez zamykania BaseStream?
źródło
GenerateStreamFromString
metodzie nie używasz przy użyciu przy użyciu StreamWriter. Czy jest tego powód?StreamWriter
i tak prawdopodobnie robi to, co powiedziałeś wewnętrznie. Zaletą jest enkapsulacja i prostszy kod, ale kosztem abstrakcji takich rzeczy, jak kodowanie. To zależy od tego, co próbujesz osiągnąć.Inne rozwiązanie:
źródło
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
jeśli chcesz dołączyć BOM na początku strumienianew MemoryStream( value, false )
. Nie możesz zrobić strumienia tylko do odczytu, jeśli musisz napisać go za pomocą programu do zapisu strumieniowego.Dodaj to do klasy narzędzia ciąg statyczny:
Dodaje to funkcję rozszerzenia, dzięki czemu możesz po prostu:
źródło
StreamWriter
. Poprawka polegała na użyciu innego konstruktora - takiego, który pozwolił mi określić parametr LeaveOpen .źródło
Użyj
MemoryStream
klasy, wywołując,Encoding.GetBytes
aby najpierw przekształcić łańcuch znaków w tablicę bajtów.Czy potrzebujesz później
TextReader
w strumieniu? Jeśli tak, możesz podaćStringReader
bezpośrednio i ominąć krokiMemoryStream
iEncoding
.źródło
Użyłem kombinacji takich odpowiedzi:
A potem używam tego w ten sposób:
źródło
Korzystamy z metod rozszerzenia wymienionych poniżej. Myślę, że powinieneś skłonić programistę do podjęcia decyzji o kodowaniu, aby w grę wchodziło mniej magii.
źródło
return ToStream(s, Encoding.UTF8);
. W obecnej implementacji (return s.ToStream(Encoding.UTF8);
deweloper jest zmuszony dos == null
NullReferenceException
Proszę bardzo:
źródło
Zmodernizowana i nieznacznie zmodyfikowana wersja metod rozszerzenia dla
ToStream
:Modyfikacja sugerowana w komentarzu @ Palec do odpowiedzi @Shaun Bowe.
źródło
Myślę, że możesz skorzystać z MemoryStream . Możesz wypełnić go bajtami ciągów uzyskanymi za pomocą metody GetBytes klasy Encoding .
źródło
Jeśli potrzebujesz zmienić kodowanie, głosuję na rozwiązanie @ShaunBowe . Ale każda odpowiedź tutaj co najmniej raz kopiuje cały ciąg do pamięci. Odpowiedzi z kombinacją
ToCharArray
+BlockCopy
zrobić to dwa razy.Jeśli to ma znaczenie, to proste
Stream
opakowanie na nieprzetworzony ciąg UTF-16. W przypadku użycia zStreamReader
wyboremEncoding.Unicode
:A oto bardziej kompletne rozwiązanie z niezbędnymi kontrolami powiązanymi (pochodzące z
MemoryStream
tak maToArray
iWriteTo
metod).źródło
Dobra kombinacja rozszerzeń String:
źródło