我正在测试的特定类依赖于HttpSessionState对象。
HttpSessionState类没有公共构造函数。被测试的类仅将此对象用作NameValue存储。该类在ASMX Web服务中用于返回特定方法的信息。
我正在考虑在HttpSessionState类周围创建一个Facade,我可以在其中提供Dictionary< string,string>而不是测试中的Session对象。
这是一个好主意还是标准做法?
答案 0 :(得分:8)
是的,正如那句老话所说,通过添加另一层抽象无法解决任何问题。我通常只是隐藏接口背后的类型,其中接口的方法是在该类型上执行我想要的操作所需的唯一方法。
只需模拟隐藏HttpSessionState的接口,并对接口的使用做Asserts,在Rhino Mocks中它只是AssertWasCalled(d => ....)等。
答案 1 :(得分:2)
您可以创建HttpSessionStateBase类的子类。 This answer展示了如何为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的博客here中找到。
答案 2 :(得分:2)
您可以使用Microsoft's Moles Isolation framework for .NET模拟任何类型甚至是密封的类型。需要做一些设置,但可能比添加另一层抽象更好。我们讨论了使用鼹鼠模拟HttpContext
和HttpSessionState
here。还有另一个类似的讨论here。