如何将单元测试写入以下代码:
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
}
答案 0 :(得分: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 Rhino Mocks语法。如果您更喜欢使用录制/播放,也可以使用它。
这就是你如何做到的。一个可能更好的解决方案是,如果ScreenshotMode
是一个枚举,你可以使用C#4,只需将它作为一个可选参数:
public Image Get(BrowserName browser, ScreenshotMode mode = ScreenshotMode.Regular)
{
//Omitted code.
}
现在你没有两种方法,所以不需要测试一种方法。
答案 1 :(得分:1)
除了使方法虚拟之外还有两种可能性(如vcsjones所解释的):
1)
为Get(浏览器,模式)编写测试模式为Regular。然后针对Get(浏览器)运行相同的测试。
毕竟两者都应该返回完全相同的结果。
或2)
将第二个Get-method的代码解压缩到一个带有接口的类中,并将其注入到测试类中。称之为:
public Image Get(BrowserName browser) {
return whatever.Get(browser, ScreenshotMode.Regular);
}
public Image Get(BrowserName browser, ScreenshotMode mode) {
return whatever.Get(browser, mode);
}
现在在测试期间,您可以注入模拟并验证第一个Get方法使用ScreenshotMode.Regular调用它,而第二个Get方法只是通过模式。