3

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

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 而不是 so?或者那不可能?

谢谢。

4

1 回答 1

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));
}

而已!当你做正确的事情时非常容易。

于 2013-10-14T13:22:13.940 回答