得到错误' Microsoft.Practices.ServiceLocation.ActivationException'发生在Microsoft.Practices.ServiceLocation.dll中

时间:2013-12-24 17:23:28

标签: unit-testing c#-4.0 mvvm prism-4

我是单元测试基于MVVM的应用程序,它使用棱镜并使用模拟来测试视图模型。我可以通过传递区域管理器和资源管理器的模拟对象来调用我的viewmodel类的构造函数,但是当控件进入构造函数时,它会在以下语句中失败:

private EventAggregator()
        {
            this.eventAggregatorInstance = ServiceLocator.Current.GetInstance<IEventAggregator>();
        }                                                                                 It gives error : An unhandled exception of type 'Microsoft.Practices.ServiceLocation.ActivationException' occurred in Microsoft.Practices.ServiceLocation.dll

其他信息:尝试获取IEventAggregator类型的实例时出现激活错误,键“”。请帮助解决此问题。

2 个答案:

答案 0 :(得分:0)

我看到您通过将EventAggregator添加到容器中来解决您的问题。

但是,我建议您的ViewModel不应该使用ServiceLocator 来解析EventAggregator。 ServiceLocator是一个美化的静态实例,基本上是反模式(参见Service Locator is an Anti-Pattern)。您的ViewModel应该很可能通过依赖注入接受构造函数中的EventAggregator并从那里使用它。我认为你不应该需要一个容器来测试你的ViewModel。您可以使用它们的构造函数构造它们,并将它们的依赖对象的任何模拟实现传递给它们(作为构造函数的参数)。

答案 1 :(得分:-1)

根据我的理解,在运行和初始化 Bootstrapper 时会初始化服务定位器。因此,您发出的例外原因是未初始化定位器

我认为考虑到你没有在单元测试中运行 Bootstrapper ,考虑到非棱镜替代方案,以下帖子会很有用/ strong>范围:

您需要在模拟容器中设置 EventAggregator ,然后为该容器设置服务定位器服务:

  

(引自上面的链接)

     

IUnityContainer container = new UnityContainer();

     

//注册事件聚合器的单例

     

container.RegisterType(new   ContainerControlledLifetimeManager());

     

ServiceLocator.SetLocatorProvider(()=&gt;容器);

我希望这能帮到你,

问候。