Unit testing RhinoMocks:清除或重置AssertWasCalled()

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

如何验证在测试的“act”部分调用了模拟,而忽略在测试的“arrange”部分调用模拟

[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一个新的模拟将无法工作。