2011-07-29 65 views
23

使用Rhino Mocks時,如何確保在模擬對象上設置Expectations時未調用方法。如何設置Expect調用以檢查在Rhino Mocks中未調用方法

在我的示例中,我正在測試Commit方法,並且需要確保在執行提交時不會調用Rollback方法。 (這是因爲我在提交方法有邏輯,如果提交失敗,它會自動回滾)

下面的代碼看起來像..

[Test] 
public void TestCommit_DoesNotRollback() 
{ 
    //Arrange 
    var mockStore = MockRepository.GenerateMock<IStore>(); 
    mockStore.Expect(x => x.Commit()); 
    //here i want to set an expectation that x.Rollback() should not be called. 

    //Act 
    subject.Commit(); 

    //Assert 
    mockStore.VerifyAllExpectation(); 
} 

當然,我可以斷言階段這樣做:

mockStore.AssertWasNotCalled(x => x.Rollback()); 

但我想將此設置爲期望值。

+0

好奇你爲什麼要使用Expectation,而不是僅僅爲AssertWasNotCalled? – Cousken

+0

@Cousken AssertWasNotCalled()似乎不適用於BackToRecord()和Replay(),也許這是原因? – danio

回答

8

這是你在找什麼?

ITest test = MockRepository.GenerateMock<ITest>(); 
test.Expect(x => x.TestMethod()).AssertWasNotCalled(mi => {}); 
+0

@Santhosh:它適合你嗎? – sll

+0

這不適合我 –

34

另一種選擇是:

mockStore.Expect(x => x.Rollback()).Repeat.Never(); 
3

這裏是另一種選擇:

 mockStore.Stub(x => x.DoThis()).Repeat.Times(0); 

     //EXECUTION HERE 

     x.VerifyAllExpectations(); 
2

對於這種情況,我創建了一個擴展方法,以更好地展示我的意圖

public static IMethodOptions<RhinoMocksExtensions.VoidType> ExpectNever<T>(this T mock, Action<T> action) where T : class 
{ 
    return mock.Expect(action).IgnoreArguments().Repeat.Never(); 
} 

注意 IgnoreArguments()調用。我假設你不希望這個方法被永遠稱爲......不管參數值是什麼。

相關問題