2008-09-12 62 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