在Rhino Mocks中验证对象调用本身

时间:2012-08-09 15:51:46

标签: c# .net unit-testing 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 Image Get(BrowserName browser, ScreenshotMode mode) {            
    // some code omitted here
}

2 个答案:

答案 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方法只是通过模式。