2011-10-14 30 views
6

我高度讚賞任何人都可以幫我在下面所提到的問題:我在單位測試使用了RhinoMock 。 我定義我的模擬對象以這種方式,與sessionToken是字符串類型:RhinoMock:如何存根和複雜的對象返回一個方法參數

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false)); 

調用FindById()返回有效新新DeviceTypeRepository()時,這是確定的代碼段newtable的(假);

然而,當包括一個複雜的參數作爲對象,例如一個DataTable,進存根如下:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false)); 

然後在其中查找()被調用的代碼段,它確實NOT回報預期的新DeviceTypeRepository()。newtable的(假)。 注意,參數DataTable的輸入值是在兩個Stub和在查找()調用相同的。

因此,我的問題是: 我怎麼能實現這樣的參數(DataTable鍵入和更一般)到存根初始化使用RhinoMock?我會很感激任何建議和方法。 感謝

+0

'數據表的_value_或_reference_在'Stub()'和'Find()'中都是​​相同的嗎? – Jeroen

回答

6

如果它沒有返回你所期望的,那麼存根調用和實際調用之間的參數不匹配。比方說,你有這樣的事情:

// Set expectations 
var someDataTable = new DataTable(columns, raws); 
mockRepository 
    .Stub(repository => repository.Find(sessionToken, dataTable)) 
    .Return(new DeviceTypeRepository().NewTable(false)); 

// Actual test 
var anotherDataTable = new DataTable(columns, raws); 
yourTestObject.DoSomethingThatLooksForTheDataTable(repository); 

這裏的事情,即使someDataTableanotherDataTable具有完全相同的內容,它們不是同一個對象,當RhinoMocks比較存根調用實際調用參數不匹配。你可以做的是使用約束:

mockRepository 
    .Stub(repository => repository.Find(
     Arg<SessionID>.Matches(y => y.ID == 2), 
     Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws) 
    )) 
    .Return(true); 
+0

有沒有其他方法可以使用RhinoMock的Contraints? Something similar: mockRepository.Stub(repository => repository.Find(...,...))。Contraints(Is.EqualTo(x),...) –

8

我相信這個問題是不是在複雜的數據類型,而是在你設置的期望。

作爲第一次嘗試修復它,在Return前加IgnoreArguments()。這可能是因爲DataTable您在指定的期望與實際-傳入的DataTable實例,以不同的預期將不會通過:

...Stub(...).IgnoreArguments().Return(); 

如果沒有幫助,您可以使用WhenCalled()手動調試它:

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    { 
     var token = mi.Arguments[0] as TokenDataType; 
     var dataTable = mi.Arguments[1] as DataTable; 
    }).Return(); 

如果這沒有幫助,請嘗試在Return()之後添加Repeat().Any()並查看它是否有效。我認爲,如果這種方法被稱爲幾次,你可能錯過了第一個返回值,但我可能是錯的。

+0

我喜歡WhenCalled用法。但是,對於Stub,您不需要添加Repeat()。Any(),這是默認行爲。 –

+0

@Amittai Shapira:好的,謝謝,任何參考文檔?我大多采用模擬和模擬它默認情況下不 – sll

+1

感謝您要求的證據重複。我錯了:(在這種情況下,模擬和存根的行爲是相似的,默認是Repeat()。Once():http://groups.google。com/group/rhinomocks/browse_thread/thread/03aff4992b5607cb –

相關問題