2008-09-10 69 views
1

假设我有一个我正在嘲笑的IFoo接口。这个接口有三种方法。我需要测试被测系统至少调用三种方法之一。我不在乎多少次,也不在乎它所谓的参数,但忽略所有方法但不触及IFoo模拟的情况就是失败的情况。Rhino Mocks - 如何测试至少有一组方法被调用?

我一直在浏览Expect.Call文档,但看不到一个简单的方法来做到这一点。

任何想法?

回答

1

当一个函数被调用时,你可以给Rhino mocks一个lambda运行。这个lambda可以增加一个计数器。断言计数器> 1,你就完成了。

评论人:Don Kirkby: 我相信Mendelt指的是Do方法。

+0

我相信Mendelt指的是Do方法。 – 2008-09-30 19:59:42

+0

感谢您对我的回答太短的有用评论。将其添加到问题中。 – Mendelt 2008-09-30 20:19:54

0

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

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

0

如果我正确理解了你的话,你想检查一下接口在三种指定方法中至少有一次被调用。通过the quick reference看我不认为你可以在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)); 
    } 
} 

(有人检查我的代码,我已经从我的脑袋现在写的这一点,并没有写C#的东西,现在大约一年)

我很想知道你为什么'虽然这样做。

相关问题