2

我最近一直在使用 RhinoMocks,但我一直遇到问题。如果我在模拟处于记录模式时闯入调试器并单步执行代码,我最终会遇到以下异常:

System.InvalidOperationException: Previous method 'SuchAndSuch.ToString();'  
requires a return value or an exception to throw.

但是,如果我在不中断调试器的情况下执行相同的代码,它将成功执行并创建模拟。

我很确定这是因为调试器在对象上调用 ToString() 以在 Locals 和其他 Watch 窗口中显示它们。但由于模拟处于记录模式,RhinoMocks 认为对 ToString() 的调用是一种期望设置,因此并不完全正确。显然,这只发生在具体类的部分模拟中。针对接口的模拟不会表现出这种行为。

其他人遇到过这个问题吗?有什么简单的补救措施吗?其他框架如 moq 或 TypeMock 是否有此问题?

谢谢,

〜贾斯汀

4

2 回答 2

3

我记得很多年前在 NMock 上遇到过类似的问题。基本上,这个问题的发生正是因为调试器使用该ToString方法调用和显示属性(除非您使用 DebuggerDisplayAttribute 或类似方法)。

如果您使用严格的模拟,这可能会特别成问题,因为它们只允许您调用成员指定的次数,而调试器会干扰这一点。使用松散的模拟可以解决这个(以及许多其他)问题。

您可能还想摆脱 Rhino Mocks 的记录/播放机制,开始使用更新更好的lambda 语法

Moq (几乎)完全使用 lamda 语法,而且我从来没有遇到过这样的问题 - 但话说回来,这些天我没有进行太多调试,因为单元测试已经成为调试的替代品。

另一种补救方法是简单地隐藏AutosLocals调试器窗口。

于 2010-03-11T13:15:53.527 回答
-1

正如 Mark 所建议的,如果您停止使用记录重放验证方法并开始使用推荐的 AAA 方法(安排、行动、断言)的存根,这个问题应该会消失。

在这篇博文中,我尝试解释了 Rhino Mocks 的区别以及如何使用它们。

于 2010-03-11T23:05:23.540 回答