我正在測試的特定類取決於HttpSessionState對象。嘲笑無公開構造函數的密封類?
的HttpSessionState類沒有公共構造函數。被測試的類僅將該對象用作NameValue存儲。該類用於ASMX Web服務以返回特定方法的信息。
我想創建一個圍繞HttpSessionState類的外觀,我可以在其中提供一個字典<字符串,字符串>而不是測試中的Session對象。
這是一個好主意,或標準的做法呢?
我正在測試的特定類取決於HttpSessionState對象。嘲笑無公開構造函數的密封類?
的HttpSessionState類沒有公共構造函數。被測試的類僅將該對象用作NameValue存儲。該類用於ASMX Web服務以返回特定方法的信息。
我想創建一個圍繞HttpSessionState類的外觀,我可以在其中提供一個字典<字符串,字符串>而不是測試中的Session對象。
這是一個好主意,或標準的做法呢?
是的,正如那句老話,沒有什麼是不能加入抽象的另一層來解決。我通常只是將類型隱藏在接口的方法之後,這些接口的方法是執行我想要的那種類型的操作所需的唯一方法。
只是嘲笑隱藏HttpSessionState接口,並做斷言接口的用途,犀牛嘲笑它只是AssertWasCalled(d => ....)等
您可以創建一個子類的HttpSessionStateBase類。 This answer演示如何實現這個的起訂量,但你仍然可以使用MockHttpSession類與犀牛嘲笑(我假設我沒有使用犀牛製品)。
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類一個相當廣泛的討論可以在斯科特Hanselman的博客here被發現。
是HttpSessionStateBase類可用於Web服務嗎? – 2012-02-06 08:03:42
@PeterSmith HttpSessionStateBase位於System.Web命名空間中,如果這就是你的意思。 – jhsowter 2012-02-06 23:06:54
你可以嘲笑使用Microsoft's Moles Isolation framework for .NET即使封存的人任何類型。花費一些工作來設置,但可能比添加另一層抽象更好。懲戒HttpContext
和HttpSessionState
使用摩爾討論here。還有另外一個類似的討論here。
我不確定如何獲得另一個項目依賴關係,因爲「全新的隔離框架」是一個簡單的解決方案(讀得更好),即一個小的抽象。 – Restuta 2012-02-06 09:26:37
@Restuta,是的,你可能是對的,但它是一個選項,並至少回答了題爲「嘲笑密封類」的標題。 – 2012-02-06 17:09:02
「沒有任何東西不能通過增加另一個抽象層來解決」 - 除了「抽象層次太多」=) – Restuta 2012-02-06 04:17:15
我相信原來是「沒有什麼是另一層間接的解決方案無法解決的。 「在某些時候,雖然你不能測試一個級別,比如你在隱藏httpsessionstate。你不熟悉它,但猜測你不能真正的單元測試它,但你可以測試SUT,如果它使用的是鍵入像這樣做「某事」。 – 2012-02-06 04:21:38
我不在乎原創,它只是true =) – Restuta 2012-02-06 09:24:12