2011-08-04 22 views
2

嗨,我是新來的嘲笑。莫克部分類像在犀牛Mocks

我有一個類:

public class Car 
{ 
    public virtual void Register() { 
     ... 
     Warrant(); 
    } 

    public virtual void Warrant() { 
     ... 
    } 
} 

我是想測試Register電話Warrant。使用RhinoMocks我想出了:

[Test] 
public void RhinoCarTest() { 
    var mocks = new Rhino.Mocks.MockRepository(); 
    var car = mocks.PartialMock<Car>(); 

    mocks.ReplayAll(); 

    car.Stub(x => x.Warrant()); 

    car.Register(); 

    car.AssertWasCalled(x => x.Warrant()); 
} 

我甚至不知道這是否正確,但它似乎做的工作。我想在Moq做同樣的事情。我似乎無法找到一個部分Moq。

我想出了:

[Test] 
public void MoqCarTest() { 
    var car = new Mock<Car>(); 

    car.Setup(x => x.Warrant()); 

    car.Object.Register(); 

    car.Verify(x => x.Warrant()); 
} 

這並不即使工作。有人能指引我朝着正確的方向嗎?

回答

1

Rhino.Mocks中的部分類將調用基類方法,除非您設置了模擬和/或存根。默認情況下,如果您創建模擬專門執行該操作,Moq將只調用基類方法。這裏是一個會爲你的工作,例如一個例子:

var car = new Mock<Car> {CallBase = true}; 
car.Object.Register(); 
car.Verify(c => c.Warrant(), Times.Once()); 

不過,我會盡量避免使用此方法(驗證一個特定的方法被調用)。相反,您的測試應該簡單地確保在調用方法後完成正確的「工作」。這項工作如何完成是該方法的私有實現。

如果您編寫確保某些方法被調用的測試,那麼隨着時間的推移,測試會變得更加脆弱 - 尤其是在重構性能或其他問題時。

+0

嗨帕特里克斯蒂爾,謝謝你的回答。所以說這是正確的,說你忘了註冊方法,並使它存根返回你想要的測試。然後你只是測試功能是否正確。另一件事是,如果你說你不應該檢查方法被稱爲你是否說你最好不應該使用驗證? – AnonyMouse

+0

如果註冊方法是您想要測試的內容,那麼您會刪除權證方法,以便其中的任何錯誤不會影響您對註冊表的單元測試。然後,你爲權證編寫一個單獨的單元測試。我使用Verify來確保在某些對象(通常是依賴項)上調用方法。例如:如果我有一個應該將數據保存到數據庫的類,我在我的「更新」調用過程中驗證我的模擬IReporitory的「保存」方法已被調用。同樣,我可以確保它不應該被調用。 – PatrickSteele

+0

嗨帕特里克斯蒂爾,謝謝你的澄清。 – AnonyMouse