使用服务定位器对Prism进行单元测试?

时间:2011-04-21 18:56:46

标签: unit-testing prism prism-4

我正在构建一个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 个答案:

答案 0 :(得分:4)

您需要创建一个模拟IServiceLocator,在测试中使用模拟提供程序初始化服务定位器。

应该这样做。

答案 1 :(得分:0)

我能够成功地对Prism + Silverlight 4应用程序进行单元测试,并且无法想到为什么您不能使用单元测试中的ServiceLocator。您需要确保在代码的[TestInitialize]部分正确初始化棱镜。