关于单元测试:Rhino Mocks-如何测试一组方法中的至少一个被调用?

关于单元测试:Rhino Mocks-如何测试一组方法中的至少一个被调用?

Rhino Mocks - How can I test that at least one of a group of methods is called?

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

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

有什么想法吗?


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

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


如果我正确理解了您想检查的接口,请确保至少在三种指定方法中的任何一种上调用了该接口。通过快速参考,我认为您不能在Rhino Mocks中做到这一点。

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

但是,为了举例说明有用,您总是可以这样做(但不要这样做)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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));
    }
}

(有人检查我的代码,我已经从脑海里写了这个,至今大约一年都没有写C#的东西了)。

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


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

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


推荐阅读