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