2012-02-06 69 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