测试是否通过测试targetObject调用同一对象上的另一个方法

时间:2010-07-18 22:46:26

标签: c# unit-testing rhino-mocks

public Class Test{
   GetDataset(RandomBoolean uncertain);
   GetDataset2();
   GetDataset3();
}

方法定义

    public virtual void GetDataset2(){}
    public virtual void GetDataset3(){}

    public virtual void GetDataset(RandomBoolean uncertain)
    {
     if (uncertain.State){
            GetDataset2();
    }
     else{
       GetDataset3();
     }
    }

    //mocking uncertain.State to return true
    //ACT
    testObject.GetDataset(uncertainMock);

我想测试当我在testObject.GetDataset()上行动时是否在内部调用GetDataset2(); 我不是在嘲笑testObject,因为它是测试对象,所以如果我尝试

testObject.AssertWasCalled(x => x.GetDataset2());

它不会让我这样做,因为testObject不是一个模拟对象。 我正在使用Rhino Mocks 3.5,我肯定在这里遗漏了一些东西。 实现这一目标的最佳方法是什么。

4 个答案:

答案 0 :(得分:3)

简短的回答是:你做不到。另一方面,你通常不想这样做。当您对该类进行单元测试时,您需要确保该类正确地进行计算并且它具有正确的副作用。您不应该测试类的内部,因为这会导致实际代码和测试的耦合太强。这个想法是你可以自由地改变你的类的实现,并使用你的测试来确保它仍然正常工作。如果您的测试检查内部状态或流程,您将无法执行此操作。

您有2个选项(取决于具体情况)

  1. 您可以通过仅查看外部可见行为的方式构建测试
  2. 如果(1)太难,可以考虑将GetDataset2重构为一个单独的类。然后你可以在测试GetDataset方法时模拟它。

答案 1 :(得分:0)

这通常不是如何使用模拟器进行单元测试的。

您应该关注协作者(您存根/模拟)和结果(void方法的状态更改),而不是被测系统的内部工作(尽管有合作者的调用)

这既是因为也是为什么你不能做出那些类型的行为观察(至少不是在没有改变你的类来适应测试,通过暴露私人成员或添加状态揭示成员 - 不是好主意)。

答案 2 :(得分:0)

有一些关于部分嘲笑here的信息。以下是关于如何使用RhinoMocks和Moq进行此操作的code snippets

试试这个:

using Rhino.Mocks;
public class TestTest {
 [Test]
 public void FooTest()
 {
   var mock = new MockRepository().PartialMock<Test>();
   mock.Expect(t => t.GetDataset2());

   mock.GetDataset((RandomBoolean)null);

 }
}

答案 3 :(得分:0)

除了通过Rhino Mocks使用部分模拟之外,您还可以创建从Test派生的类,该类用一个记录它的函数替换GetDataSet2()的实现。然后在测试中检查一下。

这是一种代码气味,但你在一堂课中做得太多了。