为什么RhinoMock不会通过此测试?

时间:2009-03-13 09:58:54

标签: c# rhino-mocks

我现在有一个类似这样的课程:

public class MyClass {

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

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

所以从不调用Method2(我的代码看起来有点不同,但我有if-clause,其值为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和一般的模拟框架开始)
  • 为什么测试通过?

2 个答案:

答案 0 :(得分:3)

正如雅各布的评论所证实的那样,PartialMock只会嘲笑抽象/虚拟方法,所以你的期望实际上并没有做任何事情。

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

答案 1 :(得分:0)

我认为部分嘲笑具体类有很多价值。比如说你有几个私有方法可以在一个类中调用。你显然需要在测试之前让它们“内部”,但是你想要有一种方法来测试它 - 不需要新的类(在很多情况下这不是正确的解决方案)。

要使此测试失败,您只需将方法2的签名设置为:

public virtual void Method2(){}