嘲笑使用Rhino.Mocks的静态方法

是否有可能嘲笑使用Rhino.Mocks的静态方法? 如果犀牛不支持这一点,是否有一个模式或东西,让我完成相同的?

是否有可能嘲笑使用Rhino.Mocks静态方法

不,这是不可能的。

TypeMock可以做到这一点,因为它利用CLR分析器拦截和redirect呼叫。

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

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

如果您不能使用TypeMock来拦截方法调用,那么build议使用的模式是创build一个代理,转发给您感兴趣testing的非虚拟或静态方法,然后在代理上设置期望值。 为了说明,请考虑以下类。

class TypeToTest { public void Method() { } } interface ITypeToTest { void Method(); } class TypeToTestProxy : ITypeToTest { TypeToTest m_type = new TypeToTest(); public void Method() { m_type.Method(); } } 

通过创build这个代理,你现在可以使用一个ITypeToTest来代替你正在传递的地方,或者设置一个TypeToTest实例,确保默认的实现在使用TypeToTestProxy时候转发给实际的实现。 然后,您可以在testing代码中创build一个模拟ITypeToTest ,并相应地设置期望值。

请注意,创build这些代理可能非常繁琐,容易出错,且耗时。 为了解决这个问题,我维护一个库和一套生成包含这些types的程序集的工具。 请参阅此页面以获取更多信息。

我所知道的唯一支持模拟静态的模拟框架是TypeMock。

正如Rytmis所build议的那样,你需要将静态的东西包装在一些东西里(例如一个带有虚拟方法或者一个接口的实例类),然后你可以把它们模拟出来。

这是Rhino Mocks最大的缺点。 我不知道Rhino Mocks甚至有可能在没有对它的嘲讽进行重新概念的情况下实现这一点。

我一直在嘲笑使用MOQ,我不认为我们可以使用这个嘲笑静态成员,因为MOQ为目标(类或接口)创build一个新的代理。 因此,只有可inheritance的成员(在类的情况下是虚拟的,在接口方面是公共的)才能被嘲弄。 显然,静态成员不会被inheritance,因此是问题所在。