2011-09-27 82 views
3

我有一個包裝流的類,目的是將該流視爲NetworkStream。但是在單元測試中,使用MemoryStream來驗證功能要容易得多。不過,我注意到MemoryStream和NetworkStream在寫入時實際上並不一樣。使用MemoryStream嘲笑NetworkStream進行單元測試

當我寫入MemoryStream時,流的seek指針被設置爲我寫的內容的結尾。爲了讀出我寫的內容,我必須將Seek指針調回到我寫的內容的開頭。

當我寫入NetworkStream時,流的另一端可以讀取數據而不用調整查找指針。

我假設NetworkStream在內部處理seek指針的概念,並確保即使它將數據填充到另一端的數據流中,也不會調整指針。

我的問題是,什麼是在MemoryStream中嘲笑相同的行爲的最佳方式是什麼?我想我可能只是尋找指針返回相同數量的字節我寫,但似乎cludgy。另外,如果我將這些流中的幾個流堆疊在一起或其他包裝流,他們將如何知道指針是否需要重置?

回答

2

MemoryStream不是爲您如何使用它而設計的。 NetworkStream旨在允許您用輸出填充一塊內存。它沒有被設計成具有從原始對象正在寫入的第二個對象。

我建議你創建一個FakeNetworkStream類。你會有兩個對象,寫入一個會將數據添加到另一個。但是FakeNetworkStream的優點是你可以實現病態套接字行爲來檢測儘可能多的錯誤。

  1. 直到用戶刷新流,才發送任何數據。當套接字不刷新時會產生微妙的錯誤,因爲數據實際發送的位置可能不同。通過始終等待直到刷新,您可以在需要實際刷新時發生測試失敗。
  2. 閱讀不能保證產生您請求的所有數據。通過一次只生成一個字節來模擬這一點。
+0

聽起來對我很好,我認爲事情並沒有太大的意義。我還沒有想過網絡流可能帶來的潛力,謝謝。 –