我正在单元测试基于MVVM的应用程序,它使用棱镜和使用mocking来测试视图模型。我可以通过传递区域管理器和资源管理器的模拟对象来调用我的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、键为"“的实例时发生激活错误。请帮助解决此问题。
发布于 2013-12-27 01:12:37
我看到您通过将EventAggregator添加到容器中解决了您的问题。
但是,我建议您的ViewModel根本不应该使用ServiceLocator来解析EventAggregator。ServiceLocator是一个被美化的静态实例,它基本上是一个反模式(参见Service Locator is an Anti-Pattern)。您的ViewModel最有可能通过依赖注入接受构造函数中的EventAggregator,并从那里使用它。我认为你不应该需要容器来测试你的ViewModels。您可以使用它们的构造函数构造它们,并将它们的依赖对象的任何模拟实现(作为构造函数的参数)传递给它们。
发布于 2013-12-26 20:48:45
根据我的理解,服务定位器是在运行和初始化引导程序时初始化的。因此,您发出的异常可能是由于未初始化定位器而导致的。
考虑到您没有在单元测试作用域上运行引导程序,我认为下面的帖子会很有用:
您需要在模拟容器中设置EventAggregator,然后为该容器设置服务定位器服务:
(引用自上述链接)
新建容器= IUnityContainer UnityContainer();
//注册您的事件聚合器的单例
新建(container.RegisterType ContainerControlledLifetimeManager() );
ServiceLocator.SetLocatorProvider( () =>容器);
我希望这对你有帮助
致以问候。
https://stackoverflow.com/questions/20764603
复制相似问题