2011-10-14 62 views
5

如何在我的測試的「行爲」部分中調用模擬,而忽略在測試的「排列」部分中對模擬的任何調用。RhinoMocks:清除或重置AssertWasCalled()

[Test] 
public void ShouldOpenThrottleWhenDrivingHome() 
{ 
    var engineMock = MockRepository.GenerateStub<IEngine>(); 
    var car = new Car(engineMock); 
    car.DriveToGroceryStore(); // this will call engine.OpenThrottle 

    car.DriveHome(); 

    engine.AssertWasCalled(e => e.OpenThrottle()); 
} 

我不想嘗試的注入新鮮的模擬或依靠.Repeat(),因爲測試則必須知道該方法被調用的次數的設置。

+1

這個問題已經被問到:http://stackoverflow.com/questions/770013/rhino-mocks-how-to-clear -previous-expectations-on-an-object –

+0

我再次讀過這個問題 - 它可能不是重複的,但我不確定問題究竟是什麼。 ClearStub()應該做什麼?存根初始化在哪裏? –

+0

是的,這不是一個複製。我編輯了這個問題,希望它更清楚。 –

回答

5

在這種情況下,我使用的是模擬,而不是存根和組合的ExpectVerifyAllExpectations

//Arrange 
var engineMock = MockRepository.GenerateMock<IEngine>(); 
var car = new Car(engineMock); 
car.DriveToGroceryStore(); // this will call engine.OpenThrottle 

engineMock.Expect(e => e.OpenThrottle()); 

//Act 
car.DriveHome(); 

//Assert 
engineMock.VerifyAllExpectations(); 

在這種情況下,排列完成後期望放在方法上。有時我覺得這是自己的測試風格:Arrange,Expect,Act,Assert

1

我已經重讀了您的問題,您似乎希望某種方法在編配階段的模擬調用和在執行階段的模擬調用之間分開。我不知道它有任何內置支持,但您可以使用WhenCalled傳遞迴調。在你的情況下,代碼會是這樣的:

// Arrange 
var engineMock = MockRepository.GenerateStub<IEngine>(); 
var car = new Car(engineMock); 
int openThrotlleCount = 0; 
engineMock.Expect(x => x.OpenThrottle(arg)).WhenCalled(invocation => openThrotlleCount++); 
car.DriveToGroceryStore(); // this will call engine.OpenThrottle 
var openThrottleCountBeforeAct = openThrotlleCount; 

// Act 
car.DriveHome(); 

// Assert 
Assert.Greater(openThrotlleCount, openThrottleCountBeforeAct); 

希望它可以幫助...

相關問題