Построение макетов в юнит-тестах
Есть ли способ создать макет вместо реального экземпляра при тестировании кода, который вызывает конструктор?
Например:
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()
{
}
}
Первый может больше соответствовать вашему примеру, если вы хотите вывести консоль там; часто это лучший подход, когда ваша зависимость должна иметь зависимость для объекта, а не необязательную.
Вы могли бы сделать намного хуже, чем исследовать концепции внедрения зависимостей и инверсии управления.