Injection Dependency дает вам возможность тестировать отдельные единицы кода изолированно.
Скажем, у меня есть класс Foo
, который принимает экземпляр класса Bar
в своем конструкторе. Один из методов на Foo
может проверить, что значение свойства Bar
является тем, которое допускает некоторую другую обработку Bar
.
public class Foo
{
private Bar _bar;
public Foo(Bar bar)
{
_bar = bar;
}
public bool IsPropertyOfBarValid()
{
return _bar.SomeProperty == PropertyEnum.ValidProperty;
}
}
Теперь давайте скажем, что Bar
конкретизируется и его свойства устанавливаются данные из некоторого источника данных в его конструктор. Как я могу протестировать метод IsPropertyOfBarValid()
Foo
(игнорируя тот факт, что это невероятно простой пример)? Ну, Foo
зависит от экземпляра Bar
, переданного конструктору, который, в свою очередь, зависит от данных из источника данных, для которого установлены его свойства. То, что мы хотели бы сделать, - это сделать какой-то способ изолировать Foo
от ресурсов, от которых он зависит, чтобы мы могли его тестировать по отдельности.
Здесь вы найдете инъекции зависимостей. Мы хотим, чтобы какой-то способ подделать экземпляр Bar
передан Foo
таким образом, что мы можем управлять свойствами, установленными на этом подделке Bar
, и достичь того, что мы намеревались сделать, проверить, что реализация IsPropertyOfBarValid()
делает то, что мы ожидаем от него, т.е. возвращаем true, когда Bar.SomeProperty == PropertyEnum.ValidProperty
и false для любого другое значение.
Существует два типа поддельных объектов, Mocks и Stubs. Stubs предоставляют входные данные для тестируемого приложения, так что тест может быть выполнен на другом. С другой стороны, макеты предоставляют вход для теста, чтобы принять решение об ошибке pass \ fail.
Martin Fowler has a great article on the difference between Mocks and Stubs
Мне нравятся все ваши причины до сих пор ... Я понимаю, что это в основном опытные программисты, которые «получают» DI. Насколько я понимаю, DI - это качество. Мы, как программисты, хотим выпускать самый высокий уровень программного обеспечения, который мы можем - и его тестирование помогает. На протяжении многих лет я написал код кода, и я рад сказать, что за 10 лет прошло более 50% его работы, и без DI. Может быть, это поможет вам понять, почему я немного зарезервирован за DI? – CodeMonkey
Очевидно, что DI является относительно новым. Поэтому, конечно, вы можете писать высококачественное программное обеспечение без него - но с продвижением таких вещей, как тестирование фреймворков и TDD, DI может значительно упростить запись тестов, а также писать код, который можно сохранить в будущем (связь). – digiarnie