如何使用Rhino Mock模拟扩展方法?
我有扩展IDataReader类型的对象,我需要一些扩展方法。 问题是现在当我尝试模拟IDataReader时,扩展方法不包含在mock中,所以当行Expect.Call(reader.ExtensionMethod()).Return(someValue)
到达ExtensionMethod
执行哪不是什么我想要! 我希望该调用是记录,当扩展方法从其他地方调用时,我希望它返回someValue
。
有谁知道怎么解决这个问题?
披露:我为Telerik工作。
扩展方法实际上是作为实例方法隐藏的静态方法。 RhinoMock不能模拟静态方法,除非你使用另一个使用分析器的模拟库,否则你无法做到这一点。
这样的图书馆是Telerik的JustMock 。
目前答案似乎不是。 虽然糟糕,但我解决了我的问题,我想为我的界面编写一个模拟类,而不是模拟。 由于我不需要那么多接口方法,所以它的速度非常快。
没有任何框架,可以存根扩展方法或任何其他静态方法。 以下代码允许您这样做,您只需要存根_doSumm
。
public static class MyExtensions { public static Func _doSumm = (x, y) => x + y; public static int Summ(this int x, int y) { return _doSumm(x, y); } }
在我自己的实例中,我将我必须的扩展方法包装到一个helper类的方法中,该方法在新接口中公开了包装器方法。 我将生产代码切换为注入了这个辅助类的实例,并更改了代码以调用新方法。 unit testing是注入辅助接口的方便制作的存根。
虽然这个解决方案并不完美,但它仍然不如交换模拟框架那么引人注目。