嘲笑没有公共构造函数的密封类

本文关键字:构造函数 密封类 | 更新日期: 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 鼹鼠隔离框架模拟任何类型的甚至密封的。 设置需要一些工作,但可能比添加另一个抽象层更好。 这里讨论使用痣嘲笑HttpContextHttpSessionState。 这里还有另一个类似的讨论。