【问题标题】:Why does RhinoMock not fail this test?为什么 RhinoMock 没有通过这个测试?
【发布时间】:2009-03-13 09:58:53
【问题描述】:

我现在有一个这样的类:

public class MyClass {

    public void Method1(){
        if (false) {
            Method2();
        }
    }

    public void Method2(){
        //do something here
    }
}

所以 Method2 永远不会被调用(我的代码看起来有点不同,但我有这个 if 子句的计算结果为 false,因此不执行 Method2。通过调试检查它以确定)。我想告诉 RhinoMocks 我希望 Method2 被调用并且测试失败:

MockRepository mock = new MockRepository();
MyClass presenter = mock.PartialMock<MyClass>();

Expect.Call(() => presenter.Method2()).IgnoreArguments();

mock.ReplayAll();
presenter.Method1();
mock.VerifyAll();

...但是测试通过了。

(Expect.Call 中的 lambda 表达式的原因是,我的实际 Method2 有参数)

我的问题:

  • 这是在这种情况下进行测试的常用方法吗? (我只是从 RhinoMocks 和一般的模拟框架开始)
  • 为什么测试通过了?

【问题讨论】:

    标签: c# rhino-mocks


    【解决方案1】:

    正如 Jakob 的 cmets 所证实的,PartialMock 仅模拟抽象/虚拟方法,因此您的期望实际上并没有做任何事情。

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

    【讨论】:

    • 没错:PartialMock 只会模拟虚拟和抽象方法。
    【解决方案2】:

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

    要使此测试失败,您只需使用方法 2 的签名即可:

    public virtual void Method2(){}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多