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了)
我很想知道我们为什么要这么做。