簡體   English   中英

沒有公共建設者的模擬密封課程?

[英]Mocking sealed classes without public constructors?

我正在測試的特定類依賴於HttpSessionState對象。

HttpSessionState類沒有公共構造函數。 被測試的類僅將此對象用作NameValue存儲。 該類在ASMX Web服務中用於返回特定方法的信息。

我正在考慮在HttpSessionState類周圍創建一個Facade,我可以在測試中提供Dictionary <string,string>而不是Session對象。

這是一個好主意還是標准做法?

是的,正如那句老話所說,沒有什么是無法通過添加另一層抽象來解決的。 我通常只是隱藏接口背后的類型,其中接口的方法是在該類型上執行我想要的操作所需的唯一方法。

只是模擬隱藏HttpSessionState的接口,並對接口的使用做Asserts,在Rhino Mocks中它只是AssertWasCalled(d => ....)等。

您可以創建HttpSessionStateBase類的子類。 這個答案顯示了如何為Moq實現這個,但你仍然可以將MockHttpSession類與你的Rhino Mocks一起使用(我假設。我沒有使用過Rhino Mocks)。

public class MockHttpSession : HttpSessionStateBase
{
    Dictionary<string, object> sessionStorage = new Dictionary<string, object>();

    public override object this[string name]
    {
        get { return sessionStorage[name]; }
        set { sessionStorage[name] = value; }
    }
}

關於如何模擬.NET類的相當廣泛的討論可以在Scott Hanselman的博客上找到

您可以使用Microsoft的Moles Isolation框架來模擬任何類型甚至密封的類型。 需要做一些設置,但可能比添加另一層抽象更好。 這里討論使用moles模擬HttpContextHttpSessionState 還有另外一個類似的討論在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM