代码之家  ›  专栏  ›  技术社区  ›  Matthias Schippling

为什么犀牛没有通过这个测试?

  •  0
  • Matthias Schippling  · 技术社区  · 16 年前

    我现在有一门课是这样的:

    public class MyClass {
    
        public void Method1(){
            if (false) {
                Method2();
            }
        }
    
        public void Method2(){
            //do something here
        }
    }
    

    所以从未调用method2(我的代码看起来有点不同,但我有一个if子句,它的计算结果为false,因此不执行method2。通过调试进行了检查。我想告诉Rhinomocks我希望调用方法2,测试失败:

    MockRepository mock = new MockRepository();
    MyClass presenter = mock.PartialMock<MyClass>();
    
    Expect.Call(() => presenter.Method2()).IgnoreArguments();
    
    mock.ReplayAll();
    presenter.Method1();
    mock.VerifyAll();
    

    …但是测试通过了。

    (expect.call中lambda表达式的原因是,我的实际method2有参数)

    我的问题:

    • 在这种情况下,这是测试的常用方法吗?(我只是从犀牛模型和一般的模拟框架开始)
    • 为什么考试通过?
    2 回复  |  直到 16 年前
        1
  •  3
  •   Jon Skeet    16 年前

    雅各布的评论证实, PartialMock 只模拟抽象/虚拟方法,所以您的期望实际上不做任何事情。

    就我个人而言,我一般不会在我测试的类中模拟出方法。我只是模拟依赖关系,并通过接口而不是具体的类来表达这些依赖关系,避免了从这个问题开始。

        2
  •  0
  •   Bryan Rowe    16 年前

    我认为部分模拟混凝土类有很多价值。例如,您有几个私有方法可以在类中被调用。显然,在测试之前需要将它们设置为“内部的”,但您希望有一种方法来测试它——而不创建新的类(在很多情况下,这不是正确的解决方案)。

    要使此测试失败,您只需在方法2上签名:

    公共虚拟void method2()