2011-05-31 126 views
11

我们需要存储将使用匿名类型作为类型参数调用的泛型方法。试想一下: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); 

这工作,如果实际调用的测试方法。报告<牛逼>()与对象的类型参数做了,但实际上,该方法被称为t是一个匿名类型。这种类型在测试方法之外是不可用的。结果,存根永远不会被调用。

是否有可能在不指定类型参数的情况下对通用方法进行存根?

+0

有点OT但被调用者如何使用匿名类型的对象?我从来没有见过这样的用例。试着在这里回顾一下通用方法的选择.. – Gishu 2011-06-01 06:47:52

+0

好问题;)关键是不要让Report方法对参数做任何事情,只是为了返回它。它有助于链接LINQ表达式。因此,我们当然可以改写它,但认为我们会去。 – 2011-06-03 10:55:36

+2

表示。如果您使用相同的顺序和类型的属性创建另一个匿名类型,则它们应该具有相同的类型。也许这可以帮助你..在你的测试中创建一个类似的虚拟类型,并对它做一个GetType()来检索类型...但就像我之前说的..看起来复杂/巧妙。简单是首选:) – Gishu 2011-06-03 11:34:30

回答

4

我不清楚你的用例,但你可能能够使用助手方法来设置每个测试的存根。我没有做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 
} 
0

要回答你的问题:不,这是不可能的存根不知道Rhino的泛型参数的泛型方法。通用参数是Rhino方法签名的重要组成部分,并且没有“任何”。

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

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