我正在使用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。
不确定它在这里期待我做什么。
任何帮助都非常感激。
由于
格里夫
答案 0 :(得分:0)
问题在于
AssertWasCalled(m => p.Thing = new ThingClass()
你没有在严格模拟上设定期望或存根。这就是为什么它在设置Thing属性时崩溃了。
我认为你不需要.Repeat.Once()对你的期望 - 这是默认选项。