使用mock.Expect()调用中的对象覆盖实例化对象

时间:2012-05-16 18:58:08

标签: c# rhino-mocks

我有一个我正在测试的方法。

void MethodIAmTesting()
{
   SomeObject so = new SomeObject();

   _someService.AnotherMethodCall(so);
}

现在,我试图在我的单元测试中模仿“如此”。

void UnitTestMethod
{
   SomeObject testSO = new SomeObject();
   //Fill in data here.

   _classMock.Expect(instance => instance.AnotherMethodCall(testSO));

   _mainClass.MethodIAmTesting();
}

但是当我运行测试时,它只使用在真实方法中实例化的空版本。我怎样才能得到我正在调用的方法来使用我的testSO而不是真正的代码呢?或者那是不可能的?

感谢。

1 个答案:

答案 0 :(得分:0)

测试驱动开发的部分设计应该引导您进行依赖注入。通常,当您发现难以进行单元测试时,这是因为您需要重新考虑您的设计。

在这种情况下,您的被测科目可能应该合理创建SomeObject。相反应该向某人提供。也许在您测试它的类首次实例化时应该提供它,也许它是在您调用该方法时应该提供的东西。例如:

public class ClassBeingTested
{    
  public ClassBeingTested(SomeObject so)
  {
    // Inject class dependency when instantiated the class
  }

  void MethodIAmTesting(SomeObject so)
  {
    // Passing things needed for a function to complete its work
  }   
}

此外,您很可能希望为SomeObject创建一个接口。然后你可以为它创建一个存根,并轻松测试对它进行的调用,存根行为/属性等。当你以这种方式做事时,测试事情就变得容易多了。例如,让我们考虑如何编写测试以确保_someService提供SomeObject

void EnsureSomeObjectPassedToService()
{
   // arrange
   SomeObject so = new SomeObject()
   // act
   _mainClass.MethodIAmTesting(so);
   // assert
   _someObject.AssertWasCalled(x => x.AnotherMethodCall(so));
}

就是这样!当你做对的时候很容易。