2012-09-18 11 views
7

Mam kilka klas, które implementują interfejs, a jednym z parametrów jest StreamWriter.C# Jednostka Testuj parametr StreamWriter

Potrzebuję sprawdzić zawartość StreamWriter.

Próbuję znaleźć sposób na uniknięcie zapisywania plików tekstowych na serwerze testowym i otwierania ich w celu sprawdzenia zawartości.

Czy istnieje sposób na szybką konwersję zawartości/strumienia StreamWriter do zmiennej StringBuilder?

Odpowiedz

11

Nie można sprawdzić the StreamWriter. Możesz sprawdzić bazowy strumień, do którego pisze. Możesz więc użyć testu MemoryStream w swoim teście jednostki i skierować do niego ten StreamWriter. Po zakończeniu pisania możesz przeczytać z niego.

[TestMethod] 
public void SomeMethod_Should_Write_Some_Expected_Output() 
{ 
    // arrange 
    using (var stream = new MemoryStream()) 
    using (var writer = new StreamWriter(stream)) 
    { 
     // act 
     sut.SomeMethod(writer); 

     // assert 
     string actual = Encoding.UTF8.GetString(stream.ToArray()); 
     Assert.AreEqual("some expected output", actual); 
    } 
} 
+1

'StreamWriter' używa UTF-8 jest domyślnie, więc to, co powinno być stosowane, aby' actual'. –

+0

Dobra rada @Jon, jak zawsze. –

+0

To zadziałało, dzięki. Inną rzeczą jest to, że zadeklarowałem rzeczywisty ciąg znaków var poza użyciem i przetestowałem go również poza użyciem. –

9

Proponuję zmienić parametr do TextWriter jeśli to w ogóle możliwe - w którym momencie można użyć StringWriter.

Alternatywnie, można utworzyć StreamWriter wokół MemoryStream, a następnie sprawdzić zawartość tego MemoryStream później (albo przez przewijanie, lub po prostu dzwoniąc ToArray() aby uzyskać pełną zawartość jako tablica bajtów. Jeśli naprawdę chcesz być testowanie tekst choć jest to zdecydowanie prostsze używanie StringWriter.

+0

Może być w stanie to zmienić, ale interfejs jest używany przez kilka innych klas. –

+3

@ user295734: Wszystko, co * używa * nadal będzie można przekazać w 'StreamWriter' - ale jeśli naprawdę chcesz czegoś, możesz napisać tekst,' TextWriter' jest prawie na pewno lepszym rozwiązaniem do użycia. Powinieneś tylko zmienić * implementacje * interfejsu ... i spodziewam się, że będą w porządku. –

+0

Gdybym był świeży, pewnie wróciłbym, by wprowadzić zmiany, jest bardzo wiele do zmiany kodu innych ludzi i takich, że nie mam czasu na przetestowanie całego ich kodu (zgaduję, że powinni napisać testy jednostkowe dla ich kod.) Dzięki za heads-up na następny raz. –

2

można zastąpić go StreamWriter że pisze do MemoryStream.

1

W takim przypadku trzeba kpić przypadek testowy. można użyć ram lubi rhino mocks - ta zaleta szyderczego szkieletu jest to, że możesz zweryfikować zawartość obiektów, ale nie musisz uderzać serwera ani zajmować zasobów serwera.

Ten link zapewni Ci podstawowe przykłady: http://www.codeproject.com/Articles/10719/Introducing-Rhino-Mocks

+2

Dlaczego sądzisz, że w tym przypadku wymaga się szyderstwa? Szyderstwo pomogłoby OP, gdyby chciał przetestować zachowanie swojego kodu w przypadkach błędów, ale aby dowiedzieć się, co jest napisane, nie trzeba używać szyderstwa. –

+1

Używamy Moq w naszych testach jednostkowych. –