2012-02-06 85 views
6

我正在測試的特定類取決於HttpSessionState對象。嘲笑無公開構造函數的密封類?

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

我想創建一個圍繞HttpSessionState類的外觀,我可以在其中提供一個字典<字符串,字符串>而不是測試中的Session對象。

這是一個好主意,或標準的做法呢?

回答

8

是的,正如那句老話,沒有什麼是不能加入抽象的另一層來解決。我通常只是將類型隱藏在接口的方法之後,這些接口的方法是執行我想要的那種類型的操作所需的唯一方法。

只是嘲笑隱藏HttpSessionState接口,並做斷言接口的用途,犀牛嘲笑它只是AssertWasCalled(d => ....)等

+3

「沒有任何東西不能通過增加另一個抽象層來解決」 - 除了「抽象層次太多」=) – Restuta 2012-02-06 04:17:15

+0

我相信原來是「沒有什麼是另一層間接的解決方案無法解決的。 「在某些時候,雖然你不能測試一個級別,比如你在隱藏httpsessionstate。你不熟悉它,但猜測你不能真正的單元測試它,但你可以測試SUT,如果它使用的是鍵入像這樣做「某事」。 – 2012-02-06 04:21:38

+0

我不在乎原創,它只是true =) – Restuta 2012-02-06 09:24:12

2

您可以創建一個子類的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被發現。

+0

是HttpSessionStateBase類可用於Web服務嗎? – 2012-02-06 08:03:42

+0

@PeterSmith HttpSessionStateBase位於System.Web命名空間中,如果這就是你的意思。 – jhsowter 2012-02-06 23:06:54

2

你可以嘲笑使用Microsoft's Moles Isolation framework for .NET即使封存的人任何類型。花費一些工作來設置,但可能比添加另一層抽象更好。懲戒HttpContextHttpSessionState使用摩爾討論here。還有另外一個類似的討論here

+1

我不確定如何獲得另一個項目依賴關係,因爲「全新的隔離框架」是一個簡單的解決方案(讀得更好),即一個小的抽象。 – Restuta 2012-02-06 09:26:37

+0

@Restuta,是的,你可能是對的,但它是一個選項,並至少回答了題爲「嘲笑密封類」的標題。 – 2012-02-06 17:09:02