2011-05-31 98 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; 
    } 
}