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 セクション内で発生する変更に焦点を当てるようにしています。
ただし、このテストの Arrange セクションには、mockA の呼び出し履歴に影響を与える (必須の) アクションが含まれています。
その結果、アサートは失敗します。

以下の構成を使用して呼び出し履歴の「変更」をキャッチできることはわかっていましたが、このテストの予想される動作が読みにくくなります。

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

私の質問: モックの通話履歴をクリアすることは可能ですか (Expectations は記録されません)?

4

1 に答える 1

0

通話履歴を消去する必要はありません。Arrange セクションで Expect の代わりに Stub メソッドを使用します。

[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 に答える