嘲笑使用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,因此是问题所在。