我如何断言一个属性是使用 RhinoMocks 在 StrictMultiMock 上设置的

本文关键字:RhinoMocks StrictMultiMock 设置 一个 何断言 断言 属性 | 更新日期: 2023-09-27 18:36:48

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

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

因此,要使用两个接口创建我的模拟对象,我不能使用 Static 方法,而是使用实例方法:

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

一切都很好,通过逐步执行代码,我看到使用了 Mock 对象,并且其属性"Thing"设置为"ThingClass"的新实例。

但是,当我尝试使用以下方法断言时:

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

当我运行这个时,我的断言报告:

System.InvalidOperationException : 无法断言未处于重播模式的对象。你忘了调用重播全部()吗?

但是,我没有ReplayAll()方法,只有一个Replay()。 当我添加它时,如下所示(将强制转换为 IOther 或不具有):

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(事物类); 预期 #0,实际 #1。

不知道它期望我在这里做什么。

任何帮助非常感谢。

谢谢

格里夫

我如何断言一个属性是使用 RhinoMocks 在 StrictMultiMock 上设置的

问题是

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

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

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