跳到内容

如何使用 Rhino Mocks/调试异常

25% developed
来自维基教科书,开放的书籍,开放的世界

ExpectationViolationException

[编辑 | 编辑源代码]

我第一次遇到 ExpectationViolationException 时,感到很困惑。它看起来像这样

失败: Rhino.Mocks.Exceptions.ExpectationViolationException : IInternalSearchService.ProcessIndexingRequest(collaboration.thecompany.com.internalServiceContractsObjects._2007._12.AuthenticationCredentials, "Zardoz", \[collaboration.thecompany.com.internalSearch._2007._12.IndexingWork\]); 预期 #0,实际 #1.

IInternalSearchService.ProcessIndexingRequest(collaboration.thecompany.com.internalServiceContractsObjects._2007._12.AuthenticationCredentials, "Zardoz", \[collaboration.thecompany.com.internalSearch._2007._12.IndexingWork\]); 预期 #1,实际 #0.







这很神秘,最终并不十分有用(至少对我来说)。基本上,当你看到它时,你只知道在测试中设置的某个期望出现了问题。以下是一些需要了解的更多信息,以及你可以做一些尝试来调试此类问题的方法

  • 期望与预期的调用_和_预期的参数都有关。如果在测试中,你写了类似 Expect.Call(myMock.DoSomething(fooObject)) 的代码,Rhino.Mocks 会期望 myMock.DoSomething 使用_fooObject 的确切实例_被调用。
  • 当 Rhino.Mocks 比较预期的参数(例如前一点中的 fooObject)时,它使用对象的 Equals() 方法。这意味着即使你的预期对象具有相同的属性值,等等,比较也会失败,除非你能传递_确切的_预期实例(或者除非你重写 Equals(),这通常不是一个好主意)。在 3.4 中,Rhino.Mocks 引入了 Property.AllPropertiesMatch() 约束,它对对象执行反射属性比较,例如:

Expect.Call(myMock.DoSomething(fooObject)).IgnoreArguments().Constraints(Property.AllPropertiesMatch(fooObject));




也就是说,期望调用 myMock.DoSomething,"忽略"所有传递的参数,但受以下约束:第一个参数的属性与 fooObject 的属性完全匹配。
  • 你可以添加一个 Rhino.Mocks 日志记录器,将数据打印到控制台。这可以提供更多关于什么在发生、在哪里发生以及为什么发生的细节。只需在模拟工作之前,在测试中添加以下代码行

RhinoMocks.Logger = new TextWriterExpectationLogger(Console.Out);




  • 当 Rhino.Mocks 在期望验证期间比较两个对象时,如果出现问题,你将在异常消息中获得的数据来自对象的 ToString()。因此,你可以重写正在比较的对象类的 ToString();重写它以提供有关比较可能出现问题的某些信息(例如,重写它以输出对象上的各种属性)。


华夏公益教科书