2012-09-18 62 views
7

我有一堆類都實現一個接口,其中一個參數是一個StreamWriter。C#單元測試StreamWriter參數

我需要檢查StreamWriter的內容。

我試圖找到一種避免在測試服務器上編寫文本文件並打開它們以檢查內容的方法。

是否有快速將StreamWriter內容/流轉換爲StringBuilder變量的方法?

回答

11

您不能檢查StreamWriter。您可以檢查它正在寫入的基礎流。所以你可以在你的單元測試中使用MemoryStream,並將其指向StreamWriter。一旦它寫完,你可以從中讀取。

[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'默認使用UTF-8,所以這是應該被用來獲取'actual'。 –

+0

好的@Jon,一如既往。 –

+0

這工作,謝謝。唯一不同的是我在使用之外聲明瞭實際的字符串var,並在使用之外對其進行了測試。 –

9

我會建議您將參數更改爲TextWriter如果在所有可能的 - 此時,你可以使用一個StringWriter

或者,你可以創建一個StreamWriter一個MemoryStream左右,然後測試MemoryStream後的內容(通過倒帶,或者只是打電話ToArray(),以獲得完整內容的字節數組。如果你真的想成爲測試文本不過,這絕對是簡單的使用StringWriter

+0

也許能夠改變它,但接口正在被其他幾個類使用。 –

+3

@ user295734:任何使用*的東西仍然可以傳入「StreamWriter」 - 但如果您真的只想要一些可以寫入文本的東西,那麼'TextWriter'幾乎肯定是一個更好的抽象。你應該只需要改變接口的*實現*,我希望它們可以很好。 –

+0

如果我開始新鮮的話,我可能會回頭進行更改,但其他人的代碼和更改只是爲了更改,我沒有時間來測試他們的所有代碼(猜測他們應該爲他們的代碼。)感謝下次提醒。 –

2

您可以寫入到一個MemoryStream一個StreamWriter更換。

1

在您需要模擬測試案例這種情況下,你可以使用框架喜歡犀牛嘲笑。嘲笑框架的優勢是,您可以驗證對象的內容,但不必訪問服務器或佔用服務器資源。

此鏈接將爲您提供基本的例子:http://www.codeproject.com/Articles/10719/Introducing-Rhino-Mocks

+2

爲什麼你認爲在這種情況下需要嘲笑?如果OP想要測試他的代碼在錯誤情況下的表現如何,嘲笑會有所幫助,但只要找出正在寫入的內容,就不需要使用模擬。 –

+1

我們在單元測試中使用Moq。 –