在单元测试中构造模拟

时间:2010-06-14 12:20:51

标签: c# nunit-mocks

在测试调用构造函数的代码时,有没有办法构建mock而不是实例?

例如:

public class ClassToTest
{
  public void MethodToTest()
  {
    MyObject foo = new MyObject();
    Console.WriteLine(foo.ToString());
  }
}

在这个例子中,我需要创建一个单元测试,确认在ClassToTest实例上调用MethodToTest确实会输出新创建的MyObject实例的ToString()方法的结果。

我无法看到一种实际测试'ClassToTest'类的方法;测试此方法实际上会测试'myObject.ToString()'方法以及MethodToTest方法。

1 个答案:

答案 0 :(得分:3)

不是真的。由于其设计,您的ClassToTest很难测试。如果您希望能够替换模拟对象的依赖关系,那么您需要考虑如何注入这些依赖关系 - 但只是在构造函数中创建它们并不是一种可以帮助您的方法。你可以使用构造函数注入:

public class ClassToTest
{
  MyObject _foo;
  public void MethodToTest(Myobject foo)
  {
    _foo = foo;
    Console.WriteLine(foo.ToString());
  }
}

或者您可以使用属性注入:

public class ClassToTest
{
  public MyObject Foo { get; set; }
  public void MethodToTest()
  {
  }
}

前者可能更适合你的例子,因为你想在那里写出控制台;当您的依赖项必须依赖于对象而不是可选的依赖项时,它通常是最好的方法。

你可能比探索dependency injectioninversion of control的概念做得更糟。