2011-10-14 65 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); 

希望它可以帮助...

相关问题