2008-09-12 66 views
2

我有一個數據訪問對象TransactionDao。當你調用TransactionDao.Save(transaction)時,我希望它設置一個transaction.IsSaved = true標誌(這是一個簡化,我試圖做的實際事情並不那麼平庸)。所以當用RhinoMocks嘲笑我的TransactionDao時,我怎麼能指出它應該改變它的輸入?Rhino Mocks:我怎樣才能嘲笑一種轉換輸入的方法?

理想我想編寫這樣的事:

Expect.Call(delegate {dao.Save(transaction);}).Override(x => x.IsSaved=true); 

有誰知道如何做到這一點?


雖然我得到了一個提示如何從實際類型簽名下面指定的答案做到這一點是關閉的,你必須做這樣的事情:因爲什麼馬克英格拉姆發表的 ,似乎是最好的答案,雖然沒有人的明確表示,現在要做到這一點:

public delegate void FakeSave(Transaction t); 
... 
Expect.Call(delegate {dao.Save(t); }).Do(new FakeSave(delegate(Transaction t2) { t.IsSaved = true; })); 

回答

4

峽谷,

最簡單的解決方案,我發現,應用到你的問題如下:

Expect.Call(() => dao.Save(transaction)) 
    .Do(new Action<Transaction>(x => x.IsSaved = true)); 

所以你不需要創建一個特殊的委託或其他任何東西。只需使用標準.NET 3.5庫中的Action即可。

希望得到這個幫助。 Frantisek

-1

你應該嘲笑的交易,並使其FO IsSaved返回true,如果你可以模擬課程的交易。

ITransaction transaction = _Mocker.dynamicMock<ITransaction>; 
Expect.Call(transaction.IsSaved).IgnoreArguments.Return(true); 
_mocker.ReplayAll(); 
dao.Save(transaction); 
+0

就像我說的,這是我正在做的簡化,還有其他的變化發生在參數和其他可以設置的標誌。我需要知道如何使用byreference參數基本上 – 2008-09-12 16:18:50

1

您可以在此使用DO回調完成:

Expect.Call(delegate {dao.Save(transaction);}) 
    .Do(x => x.IsSaved = true); 
+0

謝謝,雖然語法不完全正確,它給我一個不能轉換lambda到委託的錯誤,一旦我找出確切的語法,我會發布它,並標記你的回答。 – 2008-09-12 16:33:36