Юнит-тестирование призмы с сервисным локатором? - PullRequest
3 голосов
/ 21 апреля 2011

Я создаю приложение Prism 4 и использую ServiceLocator для создания экземпляров объектов. ServiceLocator вызывает проблемы с модульным тестированием, и это заставляет меня задуматься, стоит ли мне возвращаться к внедрению контейнера IoC в каждый класс, который в этом нуждается.

Вот пример проблемы из базового класса репозитория:

protected RepositoryBase(string filePath, Type contextType, string edmName)
{
    m_Logger = ServiceLocator.Current.GetInstance<ILoggerFacade>();

    // Log invocation
    m_Logger.Log("RepositoryBase constructor invoked.", Category.Info, Priority.None);

    // Create object context
    ...

    // Log completion
    m_Logger.Log("RepositoryBase constructor completed.", Category.Info, Priority.None);
}

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

Может ли ServiceLocator использоваться в контексте тестирования? Могу ли я бросить его и вернуться к непосредственному введению контейнера IoC? Так как сервисные локаторы, похоже, вообще не пользуются популярностью, было бы лучше не использовать их? Спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 22 апреля 2011

Вам нужно создать фиктивный IServiceLocator, инициализировать локатор сервиса с вашим фиктивным провайдером в вашем тесте.

Это должно сделать это.

0 голосов
/ 21 апреля 2011

Я смог успешно провести модульное тестирование приложения Prism + Silverlight 4 и не могу придумать причину, по которой вы не сможете использовать ServiceLocator из своих модульных тестов.Вам нужно будет убедиться, что призма правильно инициализирована в части [TestInitialize] вашего кода.

...