在没有公共建设者的情况下模拟密封课程?

我正在测试的特定类依赖于HttpSessionState对象。

HttpSessionState类没有公共构造函数。 被测试的类仅将此对象用作NameValue存储。 该类在ASMX Web服务中用于返回特定方法的信息。

我正在考虑在HttpSessionState类周围创建一个Facade,我可以在测试中提供Dictionary 而不是Session对象。

这是一个好主意还是标准做法?

是的,正如那句老话所说,没有任何东西可以通过添加另一层抽象来解决。 我通常只是隐藏接口背后的类型,其中接口的方法是在该类型上执行我想要的操作所需的唯一方法。

只是模拟隐藏HttpSessionState的接口,并对接口的使用做Asserts,在Rhino Mocks中它只是AssertWasCalled(d => ….)等。

您可以创建HttpSessionStateBase类的子类。 这个答案显示了如何为Moq实现这个,但你仍然可以将MockHttpSession类与你的Rhino Mocks一起使用(我假设。我没有使用过Rhino Mocks)。

public class MockHttpSession : HttpSessionStateBase { Dictionary sessionStorage = new Dictionary(); public override object this[string name] { get { return sessionStorage[name]; } set { sessionStorage[name] = value; } } } 

关于如何模拟.NET类的相当广泛的讨论可以在Scott Hanselman的博客上找到 。

您可以使用Microsoft的Moles Isolation框架来模拟任何类型甚至密封的类型。 需要做一些设置,但可能比添加另一层抽象更好。 这里讨论使用moles模拟HttpContextHttpSessionState 。 这里还有另一个类似的讨论。