Unit testing RhinoMocks:清除或重置AssertWasCalled()
如何验证在测试的“act”部分调用了模拟,而忽略在测试的“arrange”部分调用模拟Unit testing RhinoMocks:清除或重置AssertWasCalled(),unit-testing,mocking,rhino-mocks,Unit Testing,Mocking,Rhino Mocks,如何验证在测试的“act”部分调用了模拟,而忽略在测试的“arrange”部分调用模拟 [Test] public void ShouldOpenThrottleWhenDrivingHome() { var engineMock = MockRepository.GenerateStub<IEngine>(); var car = new Car(engineMock); car.DriveToGroceryStore(); // this will cal
[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());
}
[测试]
public void应打开ThrottleWhenDrivingHome()
{
var engineMock=MockRepository.generateSub();
var car=新车(发动机控制);
car.DriveToGroceryStore();//这将调用engine.OpenThrottle
car.DriveHome();
调用engine.assertwas(e=>e.OpenThrottle());
}
我不希望尝试注入一个新的mock或依赖.Repeat(),因为测试必须知道该方法在设置中被调用了多少次。我重新阅读了您的问题,您似乎希望有一些方法将排列阶段对mock的调用与Act阶段对mock的调用分开。我不知道有什么内置的支持,但是你可以做的是在调用时使用
传递回调。在您的情况下,代码类似于:
// 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);
//排列
var engineMock=MockRepository.generateSub();
var car=新车(发动机控制);
int openThrotlleCount=0;
Expect(x=>x.OpenThrottle(arg))。调用时(调用=>openThrotlleCount++);
car.DriveToGroceryStore();//这将调用engine.OpenThrottle
var openThrottleCountBeforeAct=OpenThrottleCount;
//表演
car.DriveHome();
//断言
更大(OpenThrottleCount、openThrottleCountBeforeAct);
希望它有帮助……在这些情况下,我使用模拟而不是存根,并结合使用Expect
和verifyallexpections
:
//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();
//排列
var engineMock=MockRepository.GenerateMock();
var car=新车(发动机控制);
car.DriveToGroceryStore();//这将调用engine.OpenThrottle
Expect(e=>e.OpenThrottle());
//表演
car.DriveHome();
//断言
engineMock.VerifyAllExpections();
在这种情况下,在安排完成后,将期望放在方法上。有时我认为这是它自己的测试风格:安排、期望、行动、断言这一个问题已经被问到了:我又读了一遍这个问题——它可能不是重复的,但我不确定到底是什么问题。ClearTub()应该做什么?存根是在哪里初始化的?是的,那不是一个重复。我已经编辑了这个问题,希望它更清楚。谢谢,现在更清楚了…啊。。。所有这些答案都需要使用专家/验证。希望有一个纯粹的AAA方法来做到这一点。实际上,我希望能够使用.Repeat()。。。除了在某个特定点重置呼叫(就在我行动之前)。我使用构造函数注入,所以给我的SUT一个新的模拟将无法工作。