Rhino Mocks:如何模拟出可以转换其输入的方法?

时间:2020-03-05 18:52:21  来源:igfitidea点击:

我有一个数据访问对象TransactionDao。当我们调用TransactionDao.Save(transaction)时,我希望它设置一个transaction.IsSaved = true标志(这是一种简化,实际上我想做的事情并不是那么平庸)。因此,当用RhinoMocks模拟我的TransactionDao时,如何指示它应该转换其输入?

理想情况下,我想写这样的东西:

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

有谁知道如何做到这一点?

尽管从实际类型签名下面指定的答案中我得到了提示,但我们必须执行以下操作:
由于马克·英格拉姆(Mark Ingram)发布的内容,这似乎是最好的答案,尽管没有人明确表示是这样做的:

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

解决方案

回答

如果可以模拟交易,则应该模拟交易并使IsSaved返回true。

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

回答

我们可以使用Do回调完成此操作:

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

回答

峡谷,

我发现,适用于问题的最简单的解决方案如下:

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

因此,我们无需创建特殊的委托人或者其他任何东西。只需使用标准.NET 3.5库中的Action。

希望对我们有所帮助。
弗朗蒂谢克