我正在使用Microsoft.Practices.ServiceLocation程序集来创建ServiceLocator。
我也在使用
模拟ServiceLocatorvar mockS = new Mock<IServiceLocator>();
这个模拟应该返回实际的servicelocator,所以代码就像
mockS.Setup(x => x.GetInstance<ISettings>()).Returns(ServiceLocator.Current.GetInstance<ISettings>());
mockS.Setup(x => x.GetInstance<IContext>()).Returns(ServiceLocator.Current.GetInstance<IContext>());
mockS.Setup(x => x.GetInstance<IXYZ>()).Returns(ServiceLocator.Current.GetInstance<IXYZ>());
我想为此创建一个通用语句,例如
mockS.Setup(x => x.GetInstance<It.IsAny<T>()>()).Returns(ServiceLocator.Current.GetInstance<T>());
但是我没有让它发挥作用。任何帮助都将非常感激。
答案 0 :(得分:2)
由于它是一个静态实例,您需要先设置它:
var mockS = new Mock<IServiceLocator>();
ServiceLocator.SetLocatorProvider(() => mockS.Object);
然后你可以在mock实例上编写设置:
mockS.Setup(x => x.GetInstance<ISettings>()).Returns(settingsMock);
您不能在类型参数上使用It.IsAny
方法。
答案 1 :(得分:0)
您需要一个通用方法:
void SetupGetInstance<T>(Mock<IServiceLocator> mock)
{
mock.Setup(x => x.GetInstance<T>()).Returns(ServiceLocator.Current.GetInstance<T>());
}
然后为您希望进行此类设置的IoC中的每个组件调用它。但是,如果在所有情况下你只是通过ServiceLocator.Current.GetInstance<T>()
得到一个实例,为什么你首先要嘲笑它?