Тестирование установки IOC (simpleServiceLocator) с помощью Specflow и WatiN - PullRequest
2 голосов
/ 13 января 2012

У меня есть некоторые приемочные тесты с использованием Specflow и WatiN, но я не уверен, где настроить мои регистрации для моего контейнера IOC (SimpleServiceLocator).

На моем веб-сайте регистрация осуществляется через мой global.asax.

В моем тестовом проекте я попытался настроить их из моего метода [BeforeScenario] с помощью кода, такого как

var container = new SimpleServiceLocator();
container.Register<ISitecoreLookupAccessor>(
    () => new SitecoreLookupAccessor());

Microsoft.Practices.ServiceLocation.ServiceLocator
    .SetLocatorProvider(() => container);

И я получил экземпляр объекта в своем проекте приложения, используя

ISitecoreLookupAccessor accessor =
    ServiceLocator.Current.GetInstance<ISitecoreLookupAccessor>();

Но я получаю сообщение об ошибке «Ссылка на объект не установлена ​​на экземпляр объекта».as ServiceLocator.Current имеет значение null ...

1 Ответ

0 голосов
/ 13 января 2012

Global.asax специфичен для ASP.NET и не будет работать в вашем тестовом проекте, потому что ваш тестовый исполнитель не может знать, что ему следует даже учитывать вероятность того, что они могут быть глобальными .asax:-)

Другими словами, чтобы вы могли использовать ServiceLocator.Current, ServiceLocator.SetLocatorProvider должен вызываться с допустимым контейнером для этого тестового проекта.При использовании MSTest существует AssemblyInitializeAttribute , который можно использовать для украшения метода.В этом случае MSTest запустит этот метод перед выполнением любого из тестовых методов в этой сборке.У других участников тестирования есть разные механизмы для этого.

Однако вместо настройки Common Service Locator в ваших тестовых проектах гораздо лучше не использовать его полностью в своих тестах.Вместо этого вставьте все зависимости тестируемого класса в его конструктор и сделайте это на этапе настройки каждого теста (вы можете для удобства реорганизовать конструкцию такого тестируемого объекта в специальный метод фабрики).Не допускайте вызова ServiceLocator из тестируемого класса (или любого класса в приложении).Таким образом, нет необходимости использовать ServiceLocator в вашем тестовом проекте.Это значительно облегчит написание тестов, так как вам не нужно поддерживать конфигурацию DI в ваших тестовых сборках (а в случае нескольких тестовых проектов у вас было бы несколько конфигураций DI).Я прошел этот путь, и моя конфигурация DI для моих тестов стала ужасно сложной, особенно с учетом того, что мне приходилось иметь дело с моим бегущим, выполняющим мои тесты параллельно, что означало, что я должен был вводить макеты и заглушки, которые были поточнобезопасными (ужас!).Но даже без параллельных тестов поддерживать конфигурацию тестового DI довольно ужасно.

...