2013-07-02 61 views
0

問題:是否可以清除模擬(或存根)的通話記錄?
(與通話記錄我的意思不是預期的/記錄的行爲。)清除通話記錄的模擬

細節:
我目前想在寫有測試根據使用NUnit和犀牛製品的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()); 
    } 
} 

爲了便於閱讀,我總是嘗試將調用集中在「動作」部分中發生的更改的「斷言」部分。
但是,此測試中的排列部分包含影響mockA呼叫歷史記錄的(必需的)操作。
因此斷言失敗。

我知道我可以使用下面的構造在通話記錄中找到「更改」,但它會使此測試的預期行爲不易讀。

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

我的問題:是否有可能清除模擬(不記錄期望)的通話記錄?

回答

0

您不需要清除通話記錄。使用存根方法,而不是期望排列部分:

[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()); 
} 
+0

不幸的是,這將無法正常工作。我在測試中添加了「MockA」代碼和一些評論以清除預期的行爲。 –

+0

經過幾年的TDD,我決定嘗試另一個模擬框架工具NSubstitute。我注意到的一件事是,我可以通過Rhinomock清除模擬通話記錄。 –