使用Rhino.Mocks模拟静态方法

abh*_*ash 46 c# tdd rhino-mocks mocking

是否可以使用Rhino.Mocks模拟静态方法?如果Rhino不支持这个,是否有一种模式或某种东西可以让我做到这一点?

Jud*_*ngo 71

是否可以使用Rhino.Mocks模拟静态方法

不,这是不可能的.

TypeMock可以这样做,因为它利用CLR分析器来拦截和重定向调用.

RhinoMocks,NMock和Moq不能这样做,因为这些库更简单; 他们不使用CLR分析器API.它们更简单,因为它们使用代理来拦截虚拟成员和接口调用.这种简单性的缺点是它们无法模拟某些事物,例如静态方法,静态属性,密封类或非虚拟实例方法.


Ryt*_*mis 22

将静态方法调用包装在另一个类中的虚拟实例方法中,然后将其模拟出来.


Ste*_*idi 17

如果您无法使用TypeMock拦截方法调用,则建议使用的模式是创建一个代理,该代理转发到您要测试的非虚拟或静态方法,然后在代理上设置期望.为了说明,请考虑以下类.

class TypeToTest
{
    public void Method() { }
}

interface ITypeToTest
{
    void Method();
}

class TypeToTestProxy : ITypeToTest
{
    TypeToTest m_type = new TypeToTest();

    public void Method() { m_type.Method(); }
}
Run Code Online (Sandbox Code Playgroud)

通过创建此代理,您现在可以使用ITypeToTest代替传递的位置或设置TypeToTest实例,确保默认实现使用TypeToTestProxy它转发到实际实现.然后,您可以ITypeToTest在测试代​​码中创建模拟并相应地设置期望.

请注意,创建这些代理可能非常繁琐,容易出错且耗时.为了解决这个问题,我维护了一个库和一组工具,可以为您生成包含这些类型的程序集.有关更多信息,请参阅此页面.