Система тестирования, в которой существуют контейнеры IoC уровня приложения и уровня запроса - PullRequest
1 голос
/ 04 апреля 2010

Моя команда находится в процессе разработки системы, в которой мы используем Unity в качестве нашего контейнера IoC;и для предоставления NHibernate ISessions (единиц работы) для каждого HTTP-запроса мы используем Unity функцию Unity * для создания дочернего контейнера для каждого запроса и вставляем туда ISession.

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

Правильнотеперь сам контейнер уровня приложения находится в HttpApplication, а контейнер Request - в HttpContext.Current.Очевидно, что ни один из них не существует во время тестирования.

Боль усиливается, когда мы решили использовать расположение службы на уровне нашего домена, чтобы «лениво» разрешать зависимости от контейнера.Так что теперь у нас есть больше компонентов, которые хотят общаться с контейнером.

Мы также используем MSTest, который представляет некоторые дилеммы параллелизма во время тестирования.

Итак, мы 'Вы задаетесь вопросом, что делают умные люди в SO-сообществе, чтобы справиться с этим затруднительным положением?

Как можно настроить приложение, которое во время «реальной» среды выполнения использует объекты HTTP для хранения контейнеров, ново время тестирования имеет гибкость для последовательного наращивания и демонтажа контейнеров, и биты ServiceLocation могут получить эти точные контейнеры.

Надеюсь, вопрос ясен, спасибо!


Спасибо за ответы.Я согласен с тем, что использование Service Location не является оптимальным подходом - но в этой ситуации это действительно необходимо.Сценарий заключается в том, что нам нужны наши сущности для разрешения зависимостей, по требованию , только при необходимости - для проверки бизнес-правил.Принуждение всех наших сущностей после материализации с помощью NHibernate к инжектированию конструктора кажется неуместным, как минимум, из соображений производительности.

Мы рассматриваем решение, в котором контейнерыхранятся либо в HttpApplication / HttpContext в реальном времени, а также в статических / ThreadStatic полях во время тестирования. StructureMap имеет аналогичный подход .Есть мысли по поводу такого решения?Спасибо!

Кроме того, это не обязательно интеграционное тестирование (хотя это тоже может сыграть в это).Например, мы хотим провести модульное тестирование поведения бизнес-правила конкретной сущности - во время которого этот сценарий будет разворачиваться.

Я определенно открыт для абстракций объекта Http - я использовал их и любил их в MVC;как можно заставить их выйти за пределы MVC?

1 Ответ

0 голосов
/ 04 апреля 2010

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

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

Очевидно, что вы не можете полагаться на реальный HTTP-контекст во время модульного тестирования, так как он не будет доступен вам в этой среде, поэтому вам придется скрывать их за интерфейсами. Если вы используете .NET 3.5 SP1, вы можете использовать абстракции, представленные в System.Web.Abstractions, но в противном случае вы можете извлечь некоторые из них самостоятельно.

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

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

...