【问题标题】:Rhino Mocks: How to stub a generic method to catch an anonymous type?Rhino Mocks:如何存根泛型方法以捕获匿名类型?
【发布时间】:2011-09-05 09:31:49
【问题描述】:

我们需要存根一个泛型方法,该方法将使用匿名类型作为类型参数来调用。考虑:

interface IProgressReporter
{
    T Report<T>(T progressUpdater);
}

// Unit test arrange:
Func<object, object> returnArg = (x => x);   // we wish to return the argument
_reporter.Stub(x => x.Report<object>(null).IgnoreArguments().Do(returnArg);

如果在被测方法中对 .Report() 的实际调用是使用 object 作为类型参数完成的,那么这将起作用,但实际上,调用该方法时 T 是匿名类型。此类型在被测方法之外不可用。因此,永远不会调用存根。

是否可以在不指定类型参数的情况下对泛型方法进行存根?

【问题讨论】:

  • 有点 OT 但被调用者如何使用匿名类型的对象?我从未见过这样的用例。只是尝试在这里查看泛型方法的选择..
  • 好问题 ;) 重点不在于 Report 方法对参数做任何事情,而只是返回它。它有助于在我们的 LINQ 表达式中进行链接。因此,我们当然可以重写它,但我们认为我们应该试一试。
  • 就是这么说的。如果您创建另一个具有相同顺序和属性类型的匿名类型,它们应该是相同的类型。也许这可以帮助您.. 在您的测试中创建一个类似的虚拟类型并对其执行 GetType() 以检索类型...但就像我之前所说的.. 看起来很复杂/聪明。简单是首选:)
  • @Gishu - 嘿,这很有趣。它会有 same 类型吗?我一定会仔细研究一下。
  • 已确认.. msdn.microsoft.com/en-us/library/bb397696.aspx 见备注部分 - 第 2 段

标签: c# unit-testing generics rhino-mocks


【解决方案1】:

我不清楚您的用例,但您可以使用辅助方法为每个测试设置存根。我没有 RhinoMocks,所以无法验证这是否可行

private void HelperMethod<T>()
{
  Func<object, object> returnArg = (x => x); // or use T in place of object if thats what you require
  _reporter.Stub(x => x.Report<T>(null)).IgnoreArguments().Do(returnArg);
}

然后在你的测试中做:

public void MyTest()
{
   HelperMethod<yourtype>();
   // rest of your test code
}

【讨论】:

    【解决方案2】:

    回答您的问题:不,在不知道 Rhino 的泛型参数的情况下,不可能存根泛型方法。泛型参数是 Rhino 中方法签名的重要组成部分,没有“任何”。

    在您的情况下,最简单的方法是编写一个手写模拟类,它提供了IProgressReporter 的虚拟实现。

    class ProgressReporterMock : IProgressReporter
    {
        T Report<T>(T progressUpdater)
        {
          return progressUpdater;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多