2010-03-19 39 views
1

我正在嘲笑一個存儲庫,該存儲庫中應該有一個用於測試場景的實體。該庫必須返回基於已知的id這個實體,當其他ID在傳遞返回任何RhinoMock方法中的參數約束

我試圖做這樣的事情:

_myRepository.Expect(item => item.Find(knownId)).Return(knownEntity); 
_myRepository.Expect(item => item.Find(Arg<Guid>.Is.Anything)).Return(null); 

看來不過第二行重寫首先,存儲庫始終返回null。當測試場景僅關注一個Id的值時,我不想嘲笑所有可能的不同ID(可能會達到幾百個)。

我知道我可以將第二行改爲第一行的負數。然而,如果存儲庫必須爲測試場景返回多於1個實體,則這會變得越來越困難(以及醜陋)。

回答

0

它確實爲我工作。我的猜測是你正在不止一次地搜索你已知的ID。嘗試將引用的行更改爲:

_myRepository.Stub(item => item.Find(knownId)).Return(knownEntity); 
_myRepository.Stub(item => item.Find(Arg<Guid>.Is.Anything)).Return(null); 

並讓我知道它是否可以解決問題。

+0

有趣。如果我使用存根,它會起作用。但是如果我用Expect(動態或靜態)替換它,它不會。那有什麼區別? – Khash 2010-03-19 15:54:17

+0

不同之處在於Expect默認設置方法只運行一次的期望,Stub另一方面總是工作。您可以將其更改爲Expect:_myRepository.Expect(item => item.Find(knownId))。Return(knownEntity).Repeat.Any();'(或類似語法) – Grzenio 2010-03-19 15:59:39

+0

另請注意,「存根」僅設置行爲它並沒有設定預期。例如,如果你想斷言你的方法被某些參數調用,那麼你必須調用'AssertWasCalled(x => x.Find(someId));'在測試結束時 – 2010-03-19 16:20:32