2011-01-28 38 views
3

MODIFIED:代碼使用HttpRequest.InputStream來讀取請求體,解析並存儲它。我希望能夠對這個班級進行單元測試,但是我不能將任何東西粘到身體上。那可能嗎?也許我可以以某種方式直接反思A類,並設置_body一些價值。如何將自定義輸入流粘貼到HttpRequest.InputStream中?

新增:這裏是簡化的設計:

class A 
{ 
    private string _body; 
    public string Body { get { return _body; } } 

    public A(HttpRequest r) 
    { 
    {parse r and store data, i.e. query parameter, etc. } 
    _body = {read body from r.InputStream }; 
    } 
} 

class B 
{ 
    public void ProcessRequest(HttpRequest r) 
    { 
    var c = new C(r); 
    ParseBody(c.Body); 
    } 
} 

這一切都很好,我確實可以測試ParseBody即使它是私有的。不過,我是單元測試A類,這就是問題所在。我可以使身體R/W屬性,但這是破壞封裝,我討厭,因爲A應該是不變的。

+0

感謝您的回答。他們都是偉大的建議,但我繼承的代碼看起來像上面。也許我不需要使用InputStream,但可能以某種方式破解使用類。 – Schultz9999 2011-01-28 17:14:16

+0

我把所有東西都翻出來,通過構造函數提供流來擺脫內部依賴關係(context.HttpRequest.InputStream)。 – Schultz9999 2011-01-28 21:39:43

回答

1

InputStream是一個標準的流,所以如果你想讓你的單元測試解析器解析你只需要在一個備用流中傳遞的內容。它不一定是來自HttpRequest,因爲這不是你正在測試的。您正在測試解析是否有效。

如果您必須將它與HttpRequest耦合,那麼請查看HttpRequestBase類,它可以讓您模擬InputStream。但正如我上面提到的那樣,這只是一個額外的方法調用來獲取流。

2

達到此目的的最佳方法是不要直接使用HttpRequest.InputStream

如果您要創建一個通過其獲取輸入流的服務,那麼可以讓它返回生產中的HttpRequest.InputStream,並返回單元測試的自定義流。

2

從外面進行測試:將腳本託管在本地某處,然後將其與您希望使用的任何物體進行調用。這不完全是一個單元測試,但如果你需要一個單元測試,直接從HttpRequest.InputStream中讀取數據,請考慮拆分連接部分和流讀數;然後您可以爲您喜歡的任何流提供流式閱讀器。

相關問題