Debugging 犀牛和海森堡

Debugging 犀牛和海森堡,debugging,rhino-mocks,moq,typemock,Debugging,Rhino Mocks,Moq,Typemock,我最近一直在使用Rhinomock,但我一直遇到一个问题。如果我在模拟处于记录模式时闯入调试器并跳过代码,我最终会得到如下异常: System.InvalidOperationException: Previous method 'SuchAndSuch.ToString();' requires a return value or an exception to throw. 但是,如果我执行相同的代码而不中断调试器,它将成功执行并创建模拟 我很确定这是因为调试器调用对象上的ToStri

我最近一直在使用Rhinomock,但我一直遇到一个问题。如果我在模拟处于记录模式时闯入调试器并跳过代码,我最终会得到如下异常:

System.InvalidOperationException: Previous method 'SuchAndSuch.ToString();'  
requires a return value or an exception to throw.
但是,如果我执行相同的代码而不中断调试器,它将成功执行并创建模拟

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

有没有其他人遇到过这个问题?有什么简单的补救办法吗?其他框架,如moq或TypeMock,是否存在此问题

谢谢


~Justin

我记得很多年前和NMock有过类似的问题。基本上,出现此问题正是因为调试器使用
ToString
方法调用和显示属性(除非使用DebuggerDisplayAttribute或类似方法)

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

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

Moq(几乎)只使用lamda语法,我从来没有遇到过这样的问题——但话说回来,我现在不怎么调试,因为单元测试已经成为调试的替代品


另一个补救办法是简单地隐藏自动和本地调试器窗口。

正如Mark所建议的那样,如果停止使用记录重播验证方法,并开始使用建议的AAA方法(排列、操作、断言)的存根,这个问题应该会消失


在这篇文章中,我试图解释犀牛模型的区别以及如何两者兼而有之。

谢谢你提供的信息。我还没有看到lambda语法。你有一个好的开始了解它的链接吗?这里是最初的声明:它也通常被称为AAA语法:感谢链接。关于你的潜在解决方案,我没有成功地隐藏汽车和本地人。我认为调试器仍然在执行ToString(),即使它们是隐藏的。它没有直接解决海森堡问题,但它是一个替代方案;相反,它只是描述了测试的总体组织,任何测试,无论是否使用模拟API。“Record replay verify”简单地描述了使用面向行为的模拟API的测试组织,在该API中可以记录期望,然后回放,最后验证。