Построение макетов в юнит-тестах - PullRequest
3 голосов
/ 14 июня 2010

Есть ли способ создать макет вместо реального экземпляра при тестировании кода, который вызывает конструктор?

Например:

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

В этом примере мне нужно создать модульный тест, который подтверждает, что вызов MethodToTest для экземпляра ClassToTest действительно будет выводить независимо от результата метода ToString () недавно созданного экземпляра MyObject.

Я не вижу способа реально протестировать класс ClassToTest изолированно; тестирование этого метода фактически проверяет метод myObject.ToString (), а также метод MethodToTest.

1 Ответ

3 голосов
/ 14 июня 2010

Не совсем. Ваш 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()
  {
  }
}

Первый может больше соответствовать вашему примеру, если вы хотите вывести консоль там; часто это лучший подход, когда ваша зависимость должна иметь зависимость для объекта, а не для дополнительной.

Вы могли бы сделать намного хуже, чем исследовать понятия внедрение зависимости и инверсия управления .

...