【问题标题】:How do I assert that a property was set on a StrictMultiMock using RhinoMocks如何断言使用 RhinoMocks 在 StrictMultiMock 上设置了属性
【发布时间】:2015-01-07 17:04:41
【问题描述】:

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

好的,我的代码是松耦合的,我从 IOC 检索我的 Mock 对象。 IOC 将模拟对象作为支持接口 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 : 无法对未处于重播模式的对象进行断言。你忘记调用 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); 预期 #0,实际 #1。

不确定它希望我在这里做什么。

非常感谢任何帮助。

谢谢

格里夫

【问题讨论】:

  • 认为我已经修复了它,但不能 100% 确定这是否是正确的方法 - 请告知。在我调用“.Replay()”的行之前,我添加: (myMock as IOther).Expect(m => m.Thing = new ThingClass()).IgnoreArguments().Repeat.Once();然后我删除了具有 .AssertWasCalled (...) 方法的行。我的代码现在运行良好。如果我将“.Repeat.Once()”更改为“Repeat.Never()”,那么我的代码将无法按照主帖中的说明执行。

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


【解决方案1】:

问题在于

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

您没有对严格的模拟设定期望或存根。这就是设置 Thing 属性时它崩溃的原因。

我认为您不需要 .Repeat.Once() 来满足您的期望 - 这是默认选项。

【讨论】:

  • 是的,请参阅我对有关设置 Expect 的原始帖子的评论。我会将此标记为答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多