2012-08-09 65 views
2

我如何編寫單元測試下面的代碼:驗證對象調用自身的犀牛嘲笑

public Image Get(BrowserName browser) 
{ 
    // if no screenshot mode specified it means that regular screenshot needed 
    return this.Get(browser, ScreenshotMode.Regular); 
} 

public Image Get(BrowserName browser, ScreenshotMode mode) {    
    // some code omitted here 
} 
+4

爲什麼不讓它調用一個通用的私有方法? – 2012-08-09 15:57:49

回答

3

這就是通常與部分模擬完成,他們可以是一個有點噁心的。

首先,您嘲笑的方法必須是纔是虛擬的。否則Rhino Mocks不能攔截該方法。所以讓我們將您的代碼更改爲:

public Image Get(BrowserName browser) 
{ 
    // if no screenshot mode specified it means that regular screenshot needed 
    return this.Get(browser, ScreenshotMode.Regular); 
} 

public virtual Image Get(BrowserName browser, ScreenshotMode mode) {    
    // some code omitted here 
} 

請注意,第二種方法現在是虛擬的。然後,我們可以設置我們的部分模擬像這樣:

//Arrange 
var yourClass = MockRepository.GeneratePartialMock<YourClass>(); 
var bn = new BrowserName(); 
yourClass.Expect(m => m.Get(bn, ScreenshotMode.Regular)); 

//Act 
yourClass.Get(bn); 

//Assert 
yourClass.VerifyAllExpectations(); 

,與AAA犀牛嘲笑語法的。如果您喜歡使用錄製/回放,您也可以使用它。


所以這就是你將如何做到這一點。一個可能更好的解決辦法是,如果ScreenshotMode是一個枚舉,你有C#4在您的處置,只讓它作爲一個可選的參數:

public Image Get(BrowserName browser, ScreenshotMode mode = ScreenshotMode.Regular) 
{ 
    //Omitted code. 
} 

現在,你不必有兩種方法,所以沒有必要測試一個叫另一個。除了製作方式虛擬(如vcsjones解釋)

1

兩個更多的可能性:

1)

寫出與獲取方式爲定期檢驗(瀏覽器模式)。然後對Get(瀏覽器)運行相同的測試。

畢竟兩者都應該返回完全相同的結果。

或2)

提取第二獲取-方法的代碼與接口的類並使其噴射到被測試類。測試你可以注入模擬和驗證第一個獲取法與ScreenshotMode.Regular調用它在

public Image Get(BrowserName browser) { 
    return whatever.Get(browser, ScreenshotMode.Regular); 
} 

public Image Get(BrowserName browser, ScreenshotMode mode) { 
    return whatever.Get(browser, mode); 
} 

現在,而第二獲取法只是傳遞的模式:與調用它。