Rhino Mocks-如何测试至少一种方法被调用?

时间:2020-03-05 18:50:36  来源:igfitidea点击:

说我有一个我正在嘲笑的接口IFoo。此界面上有3种方法。我需要测试被测系统至少调用了三种方法之一。我不在乎它调用多少次或者调用什么参数,但是它忽略所有方法并且不接触IFoo模拟的情况就是失败情况。

我一直在浏览Expect.Call文档,但看不到一种简单的方法。

有任何想法吗?

解决方案

回答

我们可以给Rhino模拟程序一个lambda,以便在调用函数get时运行。然后,此lambda可以增加一个计数器。设置计数器> 1,就可以完成。

唐·柯比(Don Kirkby)评论:
我相信Mendelt指的是Do方法。

回答

不确定是否能回答问题,但是我发现,如果我需要使用Rhino(或者任何类似的框架/库)做任何类似的事情,而我不知道该怎么做,那么最好还是创建一个手动模拟。

创建一个实现该接口的类并将公共布尔字段设置为true(如果调用了任何方法)将非常容易,我们可以为该类指定一个描述性名称,这意味着(最重要的是)下一个查看代码的人将立即明白它。

回答

如果我对理解正确,则希望检查是否在三种指定方法中的至少一种上调用了该接口。通过快速参考,我认为我们不能在Rhino Mocks中做到这一点。

凭直觉,我认为我们正在尝试编写易碎的测试,这是一件坏事。这意味着要测试的类的规范不完整。我敦促我们仔细考虑一下设计,以便被测类和被测类具有已知的行为。

但是,对于一个示例有用的是,我们总是可以这样做(但不要这样做)。

[TestFixture]
public class MyTest {

    // The mocked interface
    public class MockedInterface implements MyInterface {
       int counter = 0;
       public method1() { counter++; }
       public method2() { counter++; }
       public method3() { counter++; }
    }

    // The actual test, I assume you have the ClassUnderTest
    // inject the interface through the constructor and
    // the methodToTest calls either of the three methods on 
    // the interface.
    [TestMethod]
    public void testCallingAnyOfTheThreeMethods() {
        MockedInterface mockery = new MockedInterface();
        ClassUnderTest classToTest = new ClassUnderTest(mockery);

        classToTest.methodToTest();

        Assert.That(mockery.counter, Is.GreaterThan(1));
    }
}

(有人检查了我的代码,我已经从脑海中写了这个,至今大约一年都没有写过Cstuff了)

我很想知道我们为什么要这么做。