2009-12-30 73 views
3

請原諒我的無知。我正在努力學習犀牛。c#Rhino mocks - 這是一個適當的模擬使用嗎?

public Foo(Stream stream) 
{ 
    if (stream == null) throw new ArgumentNullException("woot"); 
    if (!stream.CanRead) throw new NotSupportedException("sporkish"); 
    if (!stream.CanSeek) throw new NotSupportedException("monkey"); 
} 

我想通過測試這些例外測試這個函數與NUnit測試。這是模擬對象的適當用法,還是我實際上需要製作一個特殊的繼承類Stream?如果嘲笑是適當的,我該如何使用Rhino來做到這一點?我可以弄清楚如何從函數(我認爲)返回虛擬值,但不是屬性。

回答

5

您可以創建Stream一個模擬這表明它無法讀取而不能尋求,如下

MockRepository mocks = new MockRepository(); 

Stream mockStream = mocks.StrictMock<Stream>(); 

Expect.Call(mockStream.CanRead).Return(false); 
Expect.Call(mockStream.CanSeek).Return(false); 

mocks.ReplayAll(); 

// Perform the unit test. 

mocks.VerifyAll(); 

一對夫婦的價值的東西要記住的嘲諷:

  1. 嘲諷不只是創建返回虛擬值的對象。一個好的模擬框架測試一個類的特定成員已被訪問。這可讓您測試以確定您正在測試的類正在對依賴對象進行正確調用。在上面的例子中,如果在VerifyAll()被調用的時候,您還沒有讀取的值CanReadCanSeek,則會拋出異常以失敗測試。
  2. 對接口進行測試時,Mocking是最有用的。您可以在特定類型中覆蓋的行爲越少,嘲笑效果就越差。在Stream的情況下,您可以覆蓋您關心的屬性,因此您可以非常容易地實現創建模擬的目標。如果你想嘲笑一個非虛擬/可重寫的屬性,你會有一個更難的任務。

您的方案,以測試三個拋出異常,你需要創建兩個單獨的模擬考試,達到所有代碼路徑:其中一個出現故障的第一個斷言 (!stream.CanRead)和其中一個經過第一斷言並且失敗了第二個斷言(!stream.CanSeek)。

+0

我明白我現在做錯了什麼。我試圖在.Return(false)調用之前使用PropertyBehavior。我想我誤解了PropertyBehavior的用法。我仍然是一個小菜鳥。 :) – Amy 2009-12-30 20:04:43

4

這是Mocks的適當用法。你需要三個Mock對象。一個沒有stream.CanRead,一個沒有stream.CanSeek,兩個都是(測試成功)。

不要忘了,這可能涉及到將您使用的Stream的功能分解爲單獨的界面(以便您可以從界面構建您的模擬對象)。