3

我正在构建一个 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 容器?由于服务定位器似乎普遍失宠,我最好不使用它吗?谢谢你的帮助。

4

2 回答 2

4

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

那应该这样做。

于 2011-04-21T20:21:07.537 回答
0

我能够成功地对 Prism + Silverlight 4 应用程序进行单元测试,并且想不出任何你不能ServiceLocator从单元测试中使用的原因。不过,您需要确保 prism 在[TestInitialize]您的部分代码中正确初始化。

于 2011-04-21T19:01:42.367 回答