如何验证在我的测试的“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(),因为测试必须知道在设置中调用方法的次数。
答案 0 :(得分:5)
在这些情况下,我使用模拟而不是存根以及Expect
和VerifyAllExpectations
的组合:
//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);
希望它有所帮助...