嘲笑没有公共构造函数的密封类
本文关键字:构造函数 密封类 | 更新日期: 2023-09-27 18:23:40
我正在测试的特定类取决于 HttpSessionState 对象。
类没有公共构造函数。 受测类仅将此对象用作 NameValue 存储区。 该类在 ASMX Web 服务中用于返回特定方法的信息。
我正在考虑围绕 HttpSessionState 类创建一个外观,我可以在其中提供字典<字符串,字符串>,而不是测试中的 Session 对象。
这是一个好主意还是标准做法?
是的,正如老话所说,没有什么不能通过添加另一层抽象来解决的。 我通常只是将类型隐藏在接口后面,其中接口的方法是唯一需要对该类型执行我想要的操作的方法。
只需模拟隐藏 HttpSessionState 的接口,并对接口的使用进行断言,在 Rhino Mocks 中,它只是 AssertWasCalled(d => ....( 等。
您可以创建 HttpSessionStateBase 类的子类。这个答案显示了如何为 Moq 实现这一点,但你仍然可以将 MockHttpSession 类与你的 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 的博客中找到。
您可以使用 Microsoft 的 .NET 鼹鼠隔离框架模拟任何类型的甚至密封的。 设置需要一些工作,但可能比添加另一个抽象层更好。 这里讨论使用痣嘲笑HttpContext
和HttpSessionState
。 这里还有另一个类似的讨论。