В этом контексте я обычно нахожу утверждения в духе «это указывает на то, что у вашего объекта слишком много зависимостей» или «у вашего объекта слишком много соавторов», чтобы быть довольно ложным заявлением. Конечно, контроллер MVC или форма будут вызывать множество различных сервисов и объектов для выполнения своих обязанностей; в конце концов, он находится на верхнем уровне приложения. Вы можете объединить некоторые из этих зависимостей в объекты более высокого уровня (скажем, ShippingMethodRepository и TransitTimeCalculator объединяются в ShippingRateFinder), но это только так, особенно для этих объектов верхнего уровня, ориентированных на представление. Это на один объект меньше, но вы только запутали фактические зависимости одним слоем косвенного обращения, а не удалили их.
Один кощунственный совет - сказать, что если вы зависимы, внедряете объект и создаете интерфейс для него, который вряд ли когда-либо изменится (вы действительно собираетесь добавить новый MessageBoxService при изменении кода? Действительно? ), то не беспокойтесь. Эта зависимость является частью ожидаемого поведения объекта, и вы должны просто протестировать их вместе, поскольку в интеграционном тесте заключается реальная ценность для бизнеса.
Другой кощунственный совет - я обычно вижу небольшую полезность в модульном тестировании контроллеров MVC или Windows Forms. Каждый раз, когда я вижу, как кто-то насмехается над HttpContext и проверяет, был ли установлен cookie, я хочу кричать. Кому интересно, если AccountController установит куки? Я не. Файл cookie не имеет ничего общего с обработкой контроллера как черного ящика; Интеграционный тест - это то, что необходимо для тестирования его функциональности (хм, вызов функции PrivilegedArea () завершился неудачно после Login () в интеграционном тесте). Таким образом, вы избежите аннулирования миллиона бесполезных модульных тестов, если формат файла cookie для входа в систему изменится.
Сохраните модульные тесты для объектной модели, сохраните интеграционные тесты для уровня представления и по возможности избегайте ложных объектов. Если издеваться над конкретной зависимостью сложно, пришло время проявить прагматичность: просто не выполняйте модульный тест, вместо этого напишите интеграционный тест и перестаньте тратить свое время.