skip to Main Content
Memory Stream Header Updated

MemoryStream jako zamiennik dla wyjścia konsoli (lub pliku)

Obecnie tworze aplikację konsolową, jest to REPL dla mojego tyci-mini języka (język nie istnieje poza REPL).

Postanowiłem, że istniejącą funkcję print pokryję testami jednostkowymi. Zastanawiałem się jak to zrobić. Problem polegał na tym że wynik przekazywałem na ekran i teraz miałem zagwozdkę jak ten tekst przechwycić.
Dowiedziałem się o klasie MemoryStream, który tworzy strumień piszący po pamięci przydzielonej dla klasy.
Moją klasę PrintMethod, musiałem zmodyfikować z:
na:
Teraz ta klasa mogła przyjąć dowolny obiekt typu TextWriter (który jest typem abstrakcyjnym). Wykorzystałem StreamWriter (który jest typem dziedziczonym po TextWriter). Jeden z konstruktorów StreamWriter przyjmuje klasę Stream poszedłem typ tropem i utworzyłem obiekty w następujący sposób:
Teraz tylko potrzebowałem sposobu na odczyt tekstu który został zapisany do MemoryStream. Pomyślałem że odczyt jest podobny jak zapis, więc utworzyłem obiekt StreamReader i wykonałem funkcję ReadLine():
Jednak za każdym razem string zwracany przez ReadLine() był pusty! Musiałem się użyć Google i dzięki StackOverflow.com otrzymałem odpowiedź.

Zapomniałem przesunąć wskaźnik będący w klasie MemoryStream, w taki sposób

I dzięki takim zabiegom mogłem się cieszyć działającymi testami jednostkowymi.

Podsumowanie, jeden test jednostkowy (wykorzystuje bibliotekę do testów NUnit):

Podziękowania dla Jerzy Goworski za ciągłe poprawianie moich wypocin.

Paweł Sołtysiak

Programista, domowy kucharz i "amator amerykańskiej polityki".
Zbieram informacje z całej sieci, po odrzuceniu chwastów i dodaniu swojej opinii publikuje na blogu.

Back To Top