Global.asax специфичен для ASP.NET и не будет работать в вашем тестовом проекте, потому что ваш тестовый исполнитель не может знать, что ему следует даже учитывать вероятность того, что они могут быть глобальными .asax:-)
Другими словами, чтобы вы могли использовать ServiceLocator.Current
, ServiceLocator.SetLocatorProvider
должен вызываться с допустимым контейнером для этого тестового проекта.При использовании MSTest существует AssemblyInitializeAttribute , который можно использовать для украшения метода.В этом случае MSTest запустит этот метод перед выполнением любого из тестовых методов в этой сборке.У других участников тестирования есть разные механизмы для этого.
Однако вместо настройки Common Service Locator в ваших тестовых проектах гораздо лучше не использовать его полностью в своих тестах.Вместо этого вставьте все зависимости тестируемого класса в его конструктор и сделайте это на этапе настройки каждого теста (вы можете для удобства реорганизовать конструкцию такого тестируемого объекта в специальный метод фабрики).Не допускайте вызова ServiceLocator
из тестируемого класса (или любого класса в приложении).Таким образом, нет необходимости использовать ServiceLocator
в вашем тестовом проекте.Это значительно облегчит написание тестов, так как вам не нужно поддерживать конфигурацию DI в ваших тестовых сборках (а в случае нескольких тестовых проектов у вас было бы несколько конфигураций DI).Я прошел этот путь, и моя конфигурация DI для моих тестов стала ужасно сложной, особенно с учетом того, что мне приходилось иметь дело с моим бегущим, выполняющим мои тесты параллельно, что означало, что я должен был вводить макеты и заглушки, которые были поточнобезопасными (ужас!).Но даже без параллельных тестов поддерживать конфигурацию тестового DI довольно ужасно.