RhinoMocks:清除或重置AssertWasCalled()

时间:2011-10-14 19:43:55

标签: unit-testing mocking rhino-mocks

如何验证在我的测试的“act”部分中调用mock,而忽略在测试的“arrange”部分中对mock的任何调用。

[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(),因为测试必须知道在设置中调用方法的次数。

2 个答案:

答案 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();

在这种情况下,在安排完成后,期望被放在方法上。有时我认为这是自己的测试风格:安排,期待,行动,断言

答案 1 :(得分:2)

我已经重读了你的问题,似乎你想要一些方法在安排阶段对模拟的调用和在Act阶段调用mock之间进行分离。我不知道它有任何内置支持,但您可以做的是使用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);

希望它有所帮助...