可以(或者应该)我在被测对象上模拟方法而不是被测试的方法吗?

时间:2008-11-19 10:33:49

标签: unit-testing mocking rhino-mocks

我有一个类似的课程:

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 个答案:

答案 0 :(得分:1)

如果没有上下文,很难说这是否可行,但是一个解决方案可以将MethodA()提取到它自己的类中,这样你就可以让MethodB()在一个模拟对象上调用MethodA(),它将作为你的单元测试愿望。

另一种可能性是在您的单元测试中继承ClassA,并根据您的单元测试覆盖MethodA()以返回true或false。

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

  ...

然后在测试中,实例化ClassAMethodAReturnTrue而不是ClassA。你也会写同样的ClassAMethodAReturnFalse。

答案 1 :(得分:1)

您可能必须从类中提取接口或使其抽象化,我有理由相信Rhino.Mocks可以模拟类和接口。这意味着你应该能够做到这样的事情:

ClassA myClass = MockRepository.PartialMock(typeof(ClassA));

Expect.Call(myClass.MethodA).Return( true );

MockRepository.ReplayAll()
Assert.AreEqual( false, myClass.MethodB() )
MockRepository.VerifyAll()

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