如何断言使用RhinoMocks在StrictMultiMock上设置属性

时间:2015-01-07 17:04:41

标签: c# unit-testing mocking tdd rhino-mocks

我正在使用RhinoMocks进行单元测试,使用" AAA"语法,我只需要断言我的一个模拟对象上的属性已更新。在使用AAA语法之前,我已经多次这样做了,这非常有效,但是这个模拟对象有点复杂,这导致了我的问题。

好的,我的代码松散耦合,我从IOC检索我的Mock对象。 IOC将模拟对象作为支持接口IMain的具体类型返回(我在这里使用虚拟名称)。更新的属性不在IMain接口上,而是在IOther接口上。

因此,要创建具有两个接口的模拟对象,我无法使用静态方法,但实例方法:

var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));

一切都很好,并且逐步完成代码,我看到使用了Mock对象及其属性&#34; Thing&#34;被设置为&#34; ThingClass&#34;。

的新实例

然而,当我尝试使用以下方式断言时:

var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));
.... (run my code) ...
(myMock as IOther).AssertWasCalled(m => p.Thing = new ThingClass(), options => options.IgnoreArguments());

当我运行此Assert报告时:

  

System.InvalidOperationException:无法对未处于重播模式的对象进行断言。你忘了打电话给ReplayAll()?

但是,我没有ReplayAll()方法,只有Replay()。当我如下所示添加它时(无论是否使用强制转换):

var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));
(myMock as IOther).Replay();
.... (run my code) ...
(myMock as IOther).AssertWasCalled(m => p.Thing = new ThingClass(), options => options.IgnoreArguments());

然后,当我的代码运行并尝试更新属性时,它会崩溃说:

  

IOther.set_Thing(ThingClass);   预期#0,实际#1。

不确定它在这里期待我做什么。

任何帮助都非常感激。

由于

格里夫

1 个答案:

答案 0 :(得分:0)

问题在于

 AssertWasCalled(m => p.Thing = new ThingClass() 

你没有在严格模拟上设定期望或存根。这就是为什么它在设置Thing属性时崩溃了。

我认为你不需要.Repeat.Once()对你的期望 - 这是默认选项。