0

问题:是否可以清除模拟(或存根)的调用历史?
(并且对于通话记录,我并不是指预期/记录的行为。)

详细信息:
我目前希望使用 NUnit 和 Rhino 模拟根据 AAA 语法编写带有测试的以下代码。

public abstract class MockA
{
    private bool _firstTime = true;

    public void DoSomething()
    {
        if (_firstTime)
        {
            OnFirstDoSomething();
            _firstTime = false;
        }
    }

    public abstract void OnFirstDoSomething();
}

[TestFixture]
public class MockATest
{
    [Test]
    public void DoSomethingShouldSkipInitializationForSequentialCalls()
    {
        // Arrange
        var mockA = MockRepository.GeneratePartialMock<MockA>();
        mockA.Expect(x => x.OnFirstDoSomething()).Repeat.Any();
        mockA.DoSomething();  // -> OnFirstDoSomething() is called
        // here I want clear the call history of mockA 

        //Act
        mockA.DoSomething(); // -> OnFirstDoSomething should NOT be called
        mockA.DoSomething(); // -> OnFirstDoSomething should NOT be called

        //assert
        mockA.AssertWasNotCalled(x => x.OnFirstDoSomething());
    }
}

为了可读性,我总是尝试将 Assert 部分中的调用集中在 Act 部分中发生的更改上。
但是,此测试中的安排部分包含影响 mockA 调用历史的(必需)操作。
结果断言失败。

我知道我可以使用下面的构造来捕捉呼叫历史记录中的“变化”,但这会降低该测试的预期行为的可读性。

{
    ...
    mockA.AssertWasCalled(x => x.OnFirstDoSomething(), opt => opt.Repeat.Once());
    //Act
    mockA.DoSomething();
    //Assert
    mockA.AssertWasCalled(x => x.OnFirstDoSomething(), opt => opt.Repeat.Once());
}

我的问题:是否可以清除模拟的通话记录(未记录的期望)?

4

1 回答 1

0

您无需清除通话记录。在 Arrange 部分使用 Stub 方法而不是 Expect:

[Test]
public void DoSomethingShouldSkipInitializationForSequentialCalls()
{
    // Arrange
    var mockA = MockRepository.GeneratePartialMock<MockA>();

    // this is what you have to change
    mockA.Stub(x => x.OnFirstDoSomething()).Repeat.Any();
    mockA.DoSomething();  // -> OnFirstDoSomething() is called
    // here I want clear the call history of mockA 

    //Act
    mockA.DoSomething();
    mockA.DoSomething();

    //assert
    mockA.AssertWasNotCalled(x => x.OnFirstDoSomething());
}
于 2013-07-03T09:19:41.983 回答