2010-03-11 63 views
2

我最近一直在使用RhinoMocks,但我一直在遇到问题。如果我闯入了调试器和单步执行代码,而一个模拟的是在拍摄模式下,我最终得到的线沿线的一个例外:RhinoMocks和Heisenbugs

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

但是,如果我没有打破进入调试器执行相同的代码,它会成功执行并创建模拟。

我敢肯定,其原因是调试器调用对象上的ToString()以在Locals和其他Watch窗口中显示它们。但由于模拟是在记录模式RhinoMocks认为调用ToString()是一个期望的设置,然后是不完全正确的。显然这只发生在对具体课程的部分嘲弄之中。模拟接口不会出现这种行为。

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

感谢,

〜贾斯汀

回答

3

我还记得很多年前具有NMock类似的问题。基本上,这个问题的发生完全是因为调试器使用ToString方法调用并显示属性(除非使用DebuggerDisplayAttribute或类似方法)。

如果您使用严格模拟,这可能会特别成问题,因为它们只允许您按指定的次数调用成员,并且调试器会干扰此操作。使用松散模拟解决了这个(和其他许多问题)。

您可能还想离开Rhino Mocks的录制/回放机制,并开始使用更新,更好的lambda语法。 Moq几乎全部使用lamda语法,而且我从来没有遇到过这样的问题 - 但是现在我再也不会调试太多,因为单元测试已经成为调试的替代品。

另一个补救方法是简单地隐藏汽车当地人调试器窗口。

+0

感谢您的信息。我没有看到lambda语法。你有一个好的起点去了解它的链接吗? – RationalGeek 2010-03-11 13:42:08

+0

以下是原始公告:http://ayende.com/Blog/archive/2008/05/16/Rhino-Mocks--Arrange-Act-Assert-Syntax.aspx – 2010-03-11 13:54:57

+0

它通常也被称为AAA语法:http: //ayende.com/Wiki/Rhino+Mocks+3.5.ashx – 2010-03-11 13:56:13

-1

正如Mark所建议的,如果您停止使用记录重放验证方法,并开始使用建议的AAA方法(安排,行为,断言)来使用存根,则此问题应该消失。

我试着解释这个差异,以及如何在这个blog post中与Rhino Mocks一起做这两件事。

+0

对我来说,AAA并不违反记录重放验证;相反,它只是描述了测试的整体组织,任何测试,无论是否使用模拟API。 “Record-replay-verify”简单地描述了使用面向行为的模拟API的测试组织结构,其中*期望*可以被记录,然后重播并最终被验证。 – 2010-10-06 18:31:05