2010-09-07 31 views
1

如何在不使用Rhino Mocks AssertWasNotCalled方法的情況下檢查Create是否未被調用。如何在Rhino Mocks中檢查Create方法是否使用Expect調用而不是AssertWasNotCalled?

下面是測試:

[Test] 
    public void When_try_to_create_directory_that_already_exits_return_false() 
    { 
     var directoryInfoMock = MockRepository.GenerateMock<IDirectoryInfoWrap>(); 
     directoryInfoMock.Stub(x => x.Exists).Return(true); 
     directoryInfoMock.Expect(x => x.Create()); 
     Assert.AreEqual(false, new DirectoryInfoSample().TryToCreateDirectory(directoryInfoMock)); 

     directoryInfoMock.VerifyAllExpectations(); 
    } 

此外,有人可以澄清存根做什麼。

+0

這與您的問題無關,但您可以使用'Assert.IsFalse(x)'而不是'Assert.AreEqual(false,x)'來提高可讀性和測試的簡潔性。 – 2010-09-07 18:14:02

+0

是的,我知道。我剛剛通過在線教程。我剛開始使用MbUnit,並注意到你是Gallio項目的一部分。非常好的工作。 – Xaisoft 2010-09-07 18:43:45

回答

2
directoryInfoMock.Stub(x => x.Exists).Return(true); 

確保對財產directoryInfoMock.Exists任何調用將返回true。但是,如果該屬性永遠不會呼叫或多次呼叫,它將而不是導致測試失敗。存根的目的是爲你的代碼提供一些膳食,以便它能正常運行。

directoryInfoMock.Expect(x => x.Create()); 

預計,該方法directoryInfoMock.Create至少一次調用。如果沒有,在執行directoryInfoMock.VerifyAllExpectations()期間Rhino.Mocks將拋出異常。

所以基本上,你的單元測試應該按預期工作。測試的輸出是什麼?


UPDATE
您可能需要指定次數的方法應被調用,以及一個明確的數字。這可以通過使用Repeat.x來完成,其中xOnce()Twice()Never()Times(N)

directoryInfoMock.Expect(x => x.Create()).Repeat.Never(); 

這預計Create從未調用。當然如果真的被調用,你的測試會失敗。

+0

嗯,我有一個測試,我想創建被調用,並且工作,但我有另一個測試,我不想創建被調用,並且好奇,如果有像DoNotExpect這樣的方法被調用。另外關於你在存根上的答案,如果我正確理解你,我基本上在Directory對象上將Exists屬性設置爲true,而不必將它明確地設置在別的地方。如果還有其他屬性需要設置,我可以將它們存根,對嗎? – Xaisoft 2010-09-07 18:39:27

+0

對於「DoNotExpect」模式,您可以使用Rhino.Mocks的Repeat屬性。看到我更新的答案。 – 2010-09-08 06:12:35

1

如果你需要確保只有你期望的方法被調用,你可以考慮使用嚴格的模擬。然後你會得到一個異常,當一個方法被調用,這不是預計你的模擬,到你的代碼中唯一的變化是,當你創建你的模擬:

var directoryInfoMock = MockRepository.GenerateStrictMock<IDirectoryInfoWrap>(); 

,如果你確切地知道哪些方法不應該叫最好使用AssertWasNotCalled(在測試執行後使用它)。這樣你就不會如此緊密地將你的測試與你的代碼聯繫起來。

相關問題