【问题标题】:Verify object calls itself in Rhino Mocks在 Rhino Mocks 中验证对象调用自身
【发布时间】:2012-08-09 15:51:46
【问题描述】:

如何将单元测试写入以下代码:

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
}

【问题讨论】:

  • 为什么不让它调用一个普通的私有方法呢?

标签: c# .net unit-testing rhino-mocks


【解决方案1】:

这通常是通过部分模拟来完成的,它们可能有点恶心。

首先,您要模拟的方法必须是虚拟的。否则 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.
}

现在你没有两个方法,所以没有必要测试一个调用另一个。

【讨论】:

    【解决方案2】:

    除了使方法虚拟化之外还有两种可能性(正如 vcsjones 解释的那样):

    1)

    为 Get(browser, mode) 编写一个测试,模式为 Regular。然后对 Get(browser) 运行相同的测试。

    毕竟两者都应该返回完全相同的结果。

    或 2)

    将第二个Get方法的代码提取到一个带有接口的类中,并使其可注入到被测试的类中。调用它:

    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 方法只是传递模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多