如何使用 Rhino Mocks/除錯異常
我第一次遇到 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();重寫它以提供有關比較可能出現問題的某些資訊(例如,重寫它以輸出物件上的各種屬性)。