2012-08-09 38 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); 
} 

现在,而第二获取法只是传递的模式:与调用它。