[英]C#: Mocking and testing protected (or private) methods in sealed classes — approaches
[英]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模擬HttpContext
和HttpSessionState
。 還有另外一個類似的討論在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.