Rhino Mocks:如何存根用于捕获匿名类型的泛型方法?

时间:2011-05-31 10:47:12

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

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

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&lt; T&gt;()的实际调用是使用object作为类型参数完成的,那么这将起作用,但实际上,调用该方法时T是匿名类型。此类型在测试方法之外不可用。因此,永远不会调用存根。

是否可以在不指定类型参数的情况下存根通用方法?

2 个答案:

答案 0 :(得分:4)

我不清楚您的用例,但您可以使用辅助方法为每个测试设置Stub。我没有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
}

答案 1 :(得分:0)

回答你的问题:不,如果不知道Rhino的泛型参数,就不可能存根泛型方法。泛型参数是Rhino中方法签名的重要部分,并且没有&#34; Any&#34;。

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

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