2011-09-09 60 views
3
[Subject(typeof(OnceADayProcessor))] 
public class When_processing_process_twice 
{ 
    private static ICanBeProcessedOnceADay ProcessedOnceADay; 

    private Establish context =() => { OnceADayProcessor.Now =() => new DateTime(2011, 1, 1, 0, 0, 0, 0); }; 

    private Because of =() => 
          { 
           ProcessedOnceADay = MockRepository.GenerateMock<ICanBeProcessedOnceADay>(); 
           ProcessedOnceADay.Process(); 
           ProcessedOnceADay.Process(); 
          }; 

    private It should_execute =() => ProcessedOnceADay.AssertWasCalled(x => x.Expect(p => p.Process())); 
    private It should_execute_only_once =() => ProcessedOnceADay.AssertWasNotCalled(x => x.Expect(p => p.Process())); 
} 

編輯解決方案:我該如何斷言一個方法只被調用一次?

[Subject(typeof(OnceADayProcessor))] 
public class When_processing_a_process_twice_at_the_same_day 
{ 
    static ICanBeProcessedOnceADay canBeProcessedOnceADay; 

    Establish context =() => 
    { 
     canBeProcessedOnceADay = A.Fake<ICanBeProcessedOnceADay>(); 
    }; 

    Because of =() => 
    { 
     OnceADayProcessor.Process(canBeProcessedOnceADay); 
     OnceADayProcessor.Process(canBeProcessedOnceADay); 
    }; 

    It should_execute_only_once =() => 
     A.CallTo(() => canBeProcessedOnceADay.Process()).MustHaveHappened(Repeated.Exactly.Once); 
} 

回答

4
var mock = MockRepository.GenerateMock<ICanBeProcessedOnceADay>(); 
mock.Expect(a => a.Process()).Repeat.Times(1); 
... 
mock.VerifyAllExpectations(); 
+2

這隻會驗證該方法被稱爲_at least_ once,而不是_exactly_ once。 –

4

我將在Itstub.AssertWasCalled(x => x.Process(), o => o.Repeat.Once())更換調用stub.Expect()stub.VerifyAllExpectations()。如果你對存根有不止一個期望,那麼你可以把每個斷言放在一個It中,讓它們彼此獨立地失敗(或成功)。

存根的創建將進入Establish(本質上,創建任何依賴關係,並且被測系統是單元測試中「排列」階段的一部分)。

也可以考慮不使用GenerateMockGenerateStub作爲嘲笑將有可能導致當你調用其他方法比Expect中指定的脆性試驗。像FakeItEasy這樣的圖書館通常提供更好更易發現的API,更容易學習,並且會讓你陷入「成功之坑」。

+0

我不明白爲什麼我應該使用存根而不是模擬。我以爲我需要一個模擬,因爲我斷言了一個電話而沒有狀態。 – Rookian

+0

http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#Thedifferencebetweenstubsandmocks 嘲笑會打破測試,存根不要。這很簡單。 –

3

如果你想確保一個方法被稱爲一次,你需要一個嚴格的模擬:

var mock = MockRepository.GenerateStrictMock<IShouldOnlyBeCalledOnce>(); 
mock.Expect(a => a.Process()).Repeat.Once(); 

sut.Process(mock) 

mock.VerifyAllExpectations(); 

如果只是用GenerateMock,它將要執行的「至少」檢查。這也適用於Repeats.Times(x)。

相關問題