Хотя я могу легко смоделировать сервис, используя внедрение зависимостей, я не могу смоделировать элементы, добавленные через событие.
Миско Хевери писал об этом паттерне: Как думать о новом операторе
Если вы смешиваете логику приложения c с построением графа ( модульное тестирование нового оператора становится невозможным ни для чего, кроме конечных узлов в вашем приложении.
Итак, если мы посмотрим на код вашей проблемы:
OnItemAdded(IItemModel addedItem)
{
var viewModel = new ItemViewModel(addedItem);
this.Items.Add(viewModel);
}
, то один изменение, которое мы могли бы рассмотреть, заключается в замене этого прямого вызова на ItemViewModel::new
более косвенным подходом
var viewModel = factory.itemViewModel(addedItem);
Где factory
обеспечивает возможность создания ItemViewModel, а дизайн позволяет нам предоставлять замены.
ItemListViewModel(IService service, Factory factory)
{
this.service.ItemAdded += this.OnItemAdded;
this.factory = factory;
}
Сделав это, вы можете (при необходимости) использовать Factory, которая обеспечивает более простую реализацию вашей модели представления элементов.
Когда это важно? Следует отметить, что вы спрашиваете о ItemViewModel, но не спрашиваете о List . Почему это так?
Пара ответов: список стабилен; нас совсем не беспокоит, что поведение самого List будет меняться таким образом, что это приведет к заметному изменению поведения ItemListViewModel. Если тест сообщит о проблеме позже, не будет никаких сомнений в том, что мы допустили ошибку в нашем коде.
Кроме того, this.List
(предположительно) изолирован. Нам не нужно беспокоиться о том, что результаты наших тестов будут нестабильными, потому что одновременно выполняется другой код. Другими словами, тест не уязвим для проблем, вызванных общим изменяемым состоянием.
Если эти свойства также применимы для ItemViewModel, то добавление к вашему коду последовательности церемоний для создания разделения между этими двумя реализациями не является на самом деле собираюсь сделать ваш дизайн "лучше".