2012-03-13 10 views
2

我試圖模擬ToString()調用我的自定義對象。我創建的界面和設置期望一個模擬的呼叫ToString()爲什麼RhinoMocks有義務明確重新定義ToString()以便能夠設置期望值?

interface ICustomObject 
{ 
} 

var customObjectMock = MockRepository.GenerateMock<ICustomObject>(); 
var fakeDump = Guid.NewGuid().ToString(); 
customObjectMock.Expect(c => c.ToString()).Return(fakeDump).Repeat.Any(); 

雖然試運行我得到了運行時異常說:

System.InvalidOperationException:無效的調用,最後調用具有 已使用或不已經調用(請確保您調用一個 虛擬(C#)。

著名的錯誤,但爲什麼我得到了它考慮到ToString()是虛擬的嗎?

,更有趣 - 我只需在界面中顯式定義ToString()周圍的工作吧:

interface ICustomObject 
{ 
    // Weird! I believe such method definition in interface would be confusing 
    // without a special remark comment saying that this method is redefined 
    // to satisfy RhinoMocks (perhaps Reflection?) 
    string ToString(); 
} 

在此之後RM允許在ToString()設定的預期。

想知道爲什麼RinoMocks有義務重新定義標準虛擬Object.ToString()?也許RM不考慮可用於每個框架對象的標準方法,並且有義務重新定義所有方法/屬性,以便能夠設定期望值?

+0

您的自定義對象中的ToString()方法是否真的是虛擬的,還是您用自己的非虛擬聲明重寫了'ToString()'? – 2012-03-13 17:08:53

+0

我只是使用我的界面來創建一個模擬並設置期望,因此不使用任何自定義對象。 [MSDN](http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx) - '公共虛擬字符串ToString()' – sll 2012-03-13 17:10:43

+0

RhinoMocks是否要求您設置其他方法的期望值'的ToString()'?如果沒有自定義對象,並且在界面中沒有方法聲明,我不確定RhinoMocks如何知道你的方法,包括'ToString()'。 – 2012-03-13 17:12:45

回答

5

接口are not objects

雖然可以在接口上隱含調用ToString(),假設是存在一些object實現你的接口,並因此提供ToString()隱含的實現。

因爲你沒有提供你的接口的實現,所以沒有什麼可以「掛鉤」ToString()方法,顯然RhinoMocks認爲測試一個實際上不存在的方法沒什麼意義。

+0

再次感謝我再次感謝!順便說一句,只是想知道如果RhinoMocks允許在這種基礎對象方法上設置期望它是否合適,否則我必須重新定義這種方法來滿足RhinoMocks /(Reflection?)在界面中看起來很奇怪,沒有特別的註釋 – sll 2012-03-13 17:45:51

+0

ToString()的目的是提供一個對象的可讀的表示。爲什麼你需要單元測試,除了證明它實際上返回一些東西? – 2012-03-13 17:58:26

+0

具有複雜的對象的層次結構我想確保頂級父項在ToString()中轉儲所有子級的詳細信息。子/父都覆蓋'ToString()'。所以我嘲笑孩子,通過父(根),然後調用'root.ToString()',以提供良好的嘲弄的孩子,我不得不嘲笑'ToString()'調用孩子。而且我正在記錄這個'ToString()',所以這非常重要 - 確保正確的信息被轉儲。我可以提供自己的'公共字符串DumpDetails()',但決定使用'ToString()',你的想法是什麼? – sll 2012-03-13 18:01:16

相關問題