我如何断言使用 RhinoMocks 在 StrictMultiMock 上设置了属性
How do I assert that a property was set on a StrictMultiMock using RhinoMocks
我使用 RhinoMocks 使用 "AAA" 语法进行单元测试,我只需要断言我的模拟对象之一的属性已更新。在使用 AAA 语法之前,我已经这样做了很多次,效果非常好,但是这个模拟对象有点复杂,这给我带来了问题。
好的,我的代码是松耦合的,我从 IOC 中检索我的 Mock 对象。 IOC returns 模拟对象作为支持接口 IMain 的具体类型(我在这里使用虚拟名称)。更新的属性不在IMain接口,而是在IOther接口。
因此,要创建具有两个接口的模拟对象,我不能使用静态方法,而是实例方法:
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 : Cannot assert on an object that is not in replay mode. Did you forget to call ReplayAll() ?
但是,我没有 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(ThingClass);
Expected #0, Actual #1.
不确定它希望我在这里做什么。
非常感谢任何帮助。
谢谢
格里夫
问题在于
AssertWasCalled(m => p.Thing = new ThingClass()
您没有对严格的模拟设置期望或存根。这就是设置 Thing 属性 时它崩溃的原因。
我认为您不需要 .Repeat.Once() - 这是默认选项。
我使用 RhinoMocks 使用 "AAA" 语法进行单元测试,我只需要断言我的模拟对象之一的属性已更新。在使用 AAA 语法之前,我已经这样做了很多次,效果非常好,但是这个模拟对象有点复杂,这给我带来了问题。
好的,我的代码是松耦合的,我从 IOC 中检索我的 Mock 对象。 IOC returns 模拟对象作为支持接口 IMain 的具体类型(我在这里使用虚拟名称)。更新的属性不在IMain接口,而是在IOther接口。
因此,要创建具有两个接口的模拟对象,我不能使用静态方法,而是实例方法:
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 : Cannot assert on an object that is not in replay mode. Did you forget to call ReplayAll() ?
但是,我没有 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(ThingClass); Expected #0, Actual #1.
不确定它希望我在这里做什么。
非常感谢任何帮助。
谢谢
格里夫
问题在于
AssertWasCalled(m => p.Thing = new ThingClass()
您没有对严格的模拟设置期望或存根。这就是设置 Thing 属性 时它崩溃的原因。
我认为您不需要 .Repeat.Once() - 这是默认选项。