代码之家  ›  专栏  ›  技术社区  ›  Sam

除了正在测试的方法之外,我可以(或应该)模拟正在测试的对象上的方法吗?

  •  2
  • Sam  · 技术社区  · 17 年前

    我有一个这样的班级:

    public class ClassA
    {
        public bool MethodA()
        {
          //do something complicated to test requiring a lot of setup
        }
        public bool MethodB()
        {
             if (MethodA())
                 //do something
             else
                 //do something else
             endif
        }
    }
    

    我对MethodA进行了测试,并想测试MethodB,但我想做的就是验证如果MethodA返回true,则表示发生了某些事情,如果MethodA回到false,则表示有其他事情发生了。我可以用Rhino Mocks做这个吗?或者我必须设置我在MethodA测试中已经设置的所有相同的模拟吗?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Darren    17 年前

    你可能需要从类中提取一个接口或使其抽象,我有理由相信Rhino。mock可以模拟类和接口。这意味着你应该能够做这样的事情:

    ClassA myClass = MockRepository.PartialMock(typeof(ClassA));
    
    Expect.Call(myClass.MethodA).Return( true );
    
    MockRepository.ReplayAll()
    Assert.AreEqual( false, myClass.MethodB() )
    MockRepository.VerifyAll()
    

    语法可能有点偏差,但这应该允许MethodB独立于MethodA进行测试

        2
  •  1
  •   philant    17 年前

    很难说这在没有上下文的情况下是否可行,但一种解决方案可以将MethodA()提取到自己的类中,这样你就可以让MethodB()在模拟对象上调用MethodA(。

    另一种可能性是在 你的单元测试 并根据您的单元测试重写MethodA()以返回true或false。

    //--- pseudo-code 
    public ClassAMethodAReturnTrue : public ClassA { 
      public bool MethodA() { return true; } 
    
      ...
    

    然后在测试中,实例化ClassAMethodARetupTrue而不是ClassA。您将同样编写ClassAMethodARetupFalse。