没有公共建设者的模拟密封课程?

时间:2012-02-06 04:03:48

标签: c# unit-testing rhino-mocks

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

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

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

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

3 个答案:

答案 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模拟任何类型甚至是密封的类型。需要做一些设置,但可能比添加另一层抽象更好。我们讨论了使用鼹鼠模拟HttpContextHttpSessionState here。还有另一个类似的讨论here