Зависимость Ввести экспозицию и DependencyResolver в ASP.NET MVC 3? - PullRequest
4 голосов
/ 03 мая 2011

У меня есть служба (AccountService), которая имеет около восьми методов.Один из этих методов отправляет электронное письмо.У меня есть другой сервис (EmailService), который конструктор вводится в AccountService.

Мне было интересно, нужно ли это делать, потому что такое ощущение, что каждый раз, когда я добавляю функциональность с зависимостью к методу, мне приходится менять все свои тесты, где я макетирую зависимости для конструктора.Такое ощущение, что DI фактически усложняет изменение вещей, а не упрощает их.

Так что я думал об использовании DependencyResolver в моем действии контроллера, которое вызывает AccountService, чтобы получить EmailService и передать его.Однако повлияет ли это на мои тесты?

Как бы я провел тестирование действия контроллера, использующего средство разрешения зависимостей?При условии, что служба учетных записей является конструктором, введенным ninject в AccountController.

Cheers.

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Не используйте DependencyResolver в вашем контроллере! Просто используйте его для создания контроллера с помощью Ninject (см. https://github.com/ninject/ninject.web.mvc/wiki). Все остальное должно быть создано Ninject с использованием инжектора конструктора.

На самом деле, модульное тестирование с надлежащим DI и конструкцией, которая следует принципам SOLID, довольно просто.

В настройке тестового устройства вы не делаете ничего, кроме создания (динамического) макета для каждой зависимости и экземпляра тестируемого объекта, используя созданные макеты в качестве зависимостей. Таким образом, вы должны вызывать конструктор ровно один раз для всех ваших тестов для каждого класса.

Если тестирование затруднено, то это не из-за DI, а скорее из-за того, что он не следует принципам SOLID (скорее всего, принцип единственной ответственности) или из-за плохих тестов, например Тесты юнитов, которые используют реальные экземпляры зависимостей, а не фиктивные или делают слишком много в настройках тестового оборудования.

0 голосов
/ 03 мая 2011

Рассматривали ли вы использование Property DI или необходимо добавить его в .ctor? Кстати: для своих тестов вы используете что-то вроде Mocking Framework (например, Moq, RhinoMocks)?

Надеюсь, это поможет вам.

...