我試圖模擬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不考慮可用於每個框架對象的標準方法,並且有義務重新定義所有方法/屬性,以便能夠設定期望值?
您的自定義對象中的ToString()方法是否真的是虛擬的,還是您用自己的非虛擬聲明重寫了'ToString()'? – 2012-03-13 17:08:53
我只是使用我的界面來創建一個模擬並設置期望,因此不使用任何自定義對象。 [MSDN](http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx) - '公共虛擬字符串ToString()' – sll 2012-03-13 17:10:43
RhinoMocks是否要求您設置其他方法的期望值'的ToString()'?如果沒有自定義對象,並且在界面中沒有方法聲明,我不確定RhinoMocks如何知道你的方法,包括'ToString()'。 – 2012-03-13 17:12:45