Построение макетов в юнит-тестах

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

Например:

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

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

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

1 ответ

Решение

На самом деле, нет. Ваш 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()
  {
  }
}

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

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

Другие вопросы по тегам