【问题标题】:How to mock extension methods with Rhino Mock?如何使用 Rhino Mock 模拟扩展方法?
【发布时间】:2010-10-21 13:59:50
【问题描述】:

我已经扩展了 IDataReader 类型的对象,其中包含一些我需要的扩展方法。现在的问题是,当我尝试模拟 IDataReader 时,扩展方法不包含在模拟中,所以当行 Expect.Call(reader.ExtensionMethod()).Return(someValue) 到达 ExtensionMethod 时,这不是我想要的!我希望记录该调用,并且当从其他地方调用扩展方法时,我希望它返回someValue

有谁知道如何解决这个问题?

【问题讨论】:

  • @abatishchev:我会说是和否:)。您建议的主题无法回答是否可能适用于 RhinoMock,而且我们也有时间方面的问题......在过去的 18 个月中,有人可能已经找到了一个聪明的解决方案。

标签: c# rhino-mocks mstest


【解决方案1】:

披露:我为 Telerik 工作。

扩展方法实际上是隐藏为实例方法的静态方法。 RhinoMock 无法模拟静态方法,而且您也无法做到,除非您使用另一个使用分析器的模拟库。

这样的库是JustMock by Telerik

【讨论】:

  • 好的...那么这如何帮助我解决 RhinoMock 的问题?
  • 它没有 :) 很抱歉,RhinoMock 不可能。 RhinoMock 通过从对象继承并覆盖它们来拦截对方法的调用(这就是它们必须是虚拟的原因)。您不能覆盖静态(扩展)方法,这就是 Rhino 在这种情况下失败的原因。
  • 我目前知道有两个库可以做到这一点——我在回复中链接到的 JustMock 和 TypeMock (typemock.com)。它们都使用探查器并在较低级别拦截方法调用,而不依赖于覆盖。这执行得较慢,但可以完成工作。
  • Microsoft Fakes 可以填充扩展。
  • Единадесет години по-късно, този коментар все още е полезен。 Благодаря ти, Славо ;)
【解决方案2】:

目前的答案似乎是否定的。虽然很糟糕,但我解决了我的问题,为我想模拟的界面编写了一个模拟类。由于我不需要接口的那么多方法,所以它运行得非常快。

【讨论】:

  • 那我不知道你为什么不接受 Slavo 的回答,因为他也是这么说的,他是第一个 :)
【解决方案3】:

可以在没有任何框架的情况下存根扩展方法或任何其他静态方法。下面的代码允许你这样做,你只需要存根_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);
    }
}

【讨论】:

    【解决方案4】:

    在我自己的实例中,我将必须存根的扩展方法包装到帮助器类的方法中,该帮助器类在新接口中公开包装器方法。我切换了我的生产代码以注入此帮助程序类的实例并更改代码以调用新方法。单元测试正在注入一个方便制作的帮助接口存根。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多