У нас есть приложение WPF. Многие из ViewModels используют те же зависимости, которые нужно издеваться. Иногда конструкторы ViewModels имеют слишком много зависимостей (over-injection), подверженных единственному намерению - разрешить модульное тестирование. Например:Как правильно использовать IoC в модульных тестах?
[ImportingConstructor]
public PasswordInputViewModel(
IPaymentSystemProvider provider,
IAppContext appCtx,
IEventAggregator eventAggregator,
IPromptCreator promptCreator) {
}
Дело в том, что три из зависимостей являются зависимости от инфраструктуры. Предоставление им только для явного впрыска с единственным намерением разрешить модульное тестирование добавляет больше шума, чем полезная информация о зависимостях ViewModel. Тем более, что почти все виртуальные машины имеют эти зависимости.
Из-за этого мы перешли эту зависимость в BaseViewModel
класс:
public class ScreenExtended : Screen {
[Import]
public IEventAggregator eventAggregator { get; private set; }
[Import]
public IPromptCreator Prompt { get; private set; }
[Import]
public IAppContext CurrentApp { get; private set; }
}
Теперь нам нужно издеваться над ними как-то из модульных тестов, уклоняющихся инъекцию конструктора. Итак, мы можем загружать IoC.
И теперь возникает вопрос: Как правильно использовать IoC здесь? Загрузите IoC для каждого класса или для каждого теста или сделайте его статическим и инициализируйте только один раз? Если мы сделаем это статичным, нам нужно как-то перекомпоновать IoC. Чтобы вы посоветовали?
Итак, когда вы пишете модульные тесты, вы повторно инициализируете IoC для каждого теста, правильно? Или вы просто удаляете предыдущего исполнителя зависимости и добавляете новый? – EngineerSpock
Повторное инициализация контейнера каждый тест, да. – toadflakz
Вы отдыхаете на собственном опыте и практике, или вы видели где-то, может быть, лучшие практики? Насколько я понимаю, у загрузочного устройства IoC в ваших модульных тестах есть несколько методов, благодаря которым вы можете передавать свои макеты и пару таких методов, как «Создать и отменить», да? – EngineerSpock