【问题标题】:RhinoMocks: Clear or reset AssertWasCalled()RhinoMocks:清除或重置 AssertWasCalled()
【发布时间】:2011-10-14 19:43:55
【问题描述】:

我如何验证在我的测试的“行为”部分中调用了一个模拟,而忽略了在测试的“排列”部分中对模拟的任何调用。

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

【问题讨论】:

  • 这个已经被问过了:stackoverflow.com/questions/770013/…
  • 我再次阅读了这个问题 - 它可能不是重复的,但我不确定问题到底是什么。 ClearStub() 应该做什么?存根在哪里初始化?
  • 是的,这不是重复。我已经编辑了这个问题,希望它更清楚。
  • 谢谢,现在清楚多了……
  • Aww...所有这些答案都需要使用专家/验证。希望有一个纯粹的 AAA 方式来做到这一点。我实际上希望能够使用 .Repeat()... 除了在特定点重置呼叫(就在我的行动之前)。我使用构造函数注入,所以给我的 SUT 一个新的模拟是行不通的。

标签: unit-testing mocking rhino-mocks


【解决方案1】:

在这些情况下,我使用模拟而不是存根以及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

【讨论】:

    【解决方案2】:

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

    希望对你有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2011-01-28
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多