2010-03-11 61 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