2008-12-05 19 views
1

我在玩Rhino Mocks並試圖在模擬對象上設置一些虛擬結果,所以當它們在我的工廠方法中調用時,我不必擔心關於數據。Rhino Mocks - 設置非虛擬方法的結果

但我碰到了一個障礙,我想要有虛擬結果的方法導致異常,因爲它們不是虛擬

我有這樣的代碼:

using(mock.Record()){ 
    SetupResult.For(service.SomeMethod()).Return("hello world"); 
} 

是否SomeMethod方法已經成爲一個虛擬的是有嘲笑的結果?

另外,SetupResult.ForExpect.Call之間有什麼區別?

回答

4

Rhino Mocks使用DynamicProxy2來完成它的魔術,所以你將無法在非虛擬方法上設置期望/結果。

至於SetupResult.ForExpect.Call之間的差異,如果您希望在未調用某個方法時測試失敗,請使用Expect.Call。如果你只是想從你的模擬對象提供一個結果,而你不想失敗驗證,如果它不叫,用SetupResult.For

所以下面將失敗:

using(mock.Record()){ 
    Expect.Call(service.SomeMethod()).Return("you have to run me"); 
} 

using(mock.Replay()){ 
    // Some code that never calls service.SomeMethod() 
} 

而這個測試將不會:

using(mock.Record()){ 
    SetupResult.For(service.SomeMethod()).Return("you don't have to run me"); 
} 

using(mock.Replay()) { 
    // Some code that never calls service.SomeMethod() 
} 

這有道理嗎?

+1

謝謝,這解釋得很好。當我發現這個時,我正在對Typemock和Rhino Mocks進行比較。 Typemock可以嘲諷非虛擬化,所以它在我的書中至今還是一個優點。 – 2008-12-05 07:11:14