我是单元测试基于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类型的实例时出现激活错误,键“”。请帮助解决此问题。
答案 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;容器);
我希望这能帮到你,
问候。