ASP MVC DependencyResolver с UnityContainer для модульного тестирования - PullRequest
1 голос
/ 27 июля 2011

Я создаю приложение ASP MVC 3, в котором я использую Unity в качестве контейнера IOC и регистрирую его в DependencyResolver. В моем контроллере я могу сделать это:

DependencyResolver.Current.GetService(GetType(IViewAllPersonsHandler))

Затем, когда я пишу свои модульные тесты, я переопределяю свои сопоставления в моем тесте, чтобы использовать имитированные объекты.

Мой коллега сказал мне, что это считается анти-паттерном.

Может кто-нибудь сказать мне, так ли это и почему?

Я знаю, что обычно я должен вставлять свои зависимости в конструктор, но по мере роста моего контроллера параметры конструктора становятся длиннее.

Thx

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Большинство людей считают шаблон поиска службы анти-шаблоном.Вероятно, так как можно обойти это с некоторым трудом.

Если вы делаете это для ограничения параметров конструктора, вы можете попробовать что-то другое.Я использую свойство инъекции.Поскольку я использую замок Виндзор, контейнер по умолчанию вводит открытые свойства.В последний раз я смотрел, что Unity этого не делал, и вам пришлось использовать какое-то расширение, чтобы заставить это работать.

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

HTH

1 голос
/ 07 марта 2014

Вы можете использовать System.Web.Mvc.DependencyResolver.SetResolver (resovlveDependencyMock);

0 голосов
/ 18 октября 2017

С Moq это просто:

DependencyResolver.SetResolver(Mock.Of<IServiceLocator>(s => s.GetInstance(It.IsAny<Type>()) == cacheMock.Object));
...