如何使用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是注入辅助接口的方便制作的存根。

虽然这个解决方案并不完美,但它仍然不如交换模拟框架那么引人注目。