c# – 在RhinoMocks中模拟void函数的正确方法是什么?

我有这个接口,在我想模拟的一些函数中返回void,并想知道这样做的正确方法是什么.截至目前,我有以下内容
var mocks = new MockRepository();
var mockedInterface = mocks.CreateMock<IMyInterface>();
Expect.Call(mockedInterface.FunctionThatReturn(param1,param2)).Return(Something);
mockedInterface.FunctionReturningVoid(param3,param4);
mocks.ReplayAll();

// Some assert and other stuff
mocks.VerifyAll();

这是正确的做法吗?我觉得它看起来很奇怪,因为你没有以同样的方式处理这两个函数.我想写的是:

var mocks = new MockRepository();
var mockedInterface = mocks.CreateMock<IMyInterface>();
Expect.Call(mockedInterface.FunctionThatReturn(param1,param2)).Return(Something);
Expect.Call(mockedInterface.FunctionReturningVoid(param3,param4)); // This doesn't work.
mocks.ReplayAll();

// Some assert and other stuff
mocks.VerifyAll();

但这不适用于第4行.我发现一些博客说你可以使用lambda(或委托)之类的

Expect.Call(() => mockedInterface.FunctionReturningVoid(param3,param4)); // This doesn't work.

但这对我来说似乎不起作用.拥有Expect.Call可以轻松识别模拟函数,这就是我想要它的原因.我得到的编译错误是:“无法将lambda表达式转换为类型’对象’,因为它不是委托类型”.

那怎么办呢?

更新:添加了编译错误信息.

解决方法

我更喜欢AAA(编号/动作/断言)语法而不是记录/重放.它更直接,使测试更容易阅读.你想要做的是:
// arrange
var mock = MockRepository.GenerateMock<IMyInterface>
mock.Expect(i => i.FunctionThatReturnSomething(param1,param2)).Return("hello");
mock.Expect(i => i.FunctionThatReturnVoid(param3,param4));
// set up other stuff for your code (like whatever code depends on IMyInterface)
var foo = new Foo(mock);

// act
foo.DoSomething();

// assert
mock.VerifyAll();

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...