通用ServiceLocator GetInstance

时间:2014-05-24 09:12:46

标签: c# moq service-locator

我正在使用Microsoft.Practices.ServiceLocation程序集来创建ServiceLocator。

我也在使用

模拟ServiceLocator
var 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>());   

但是我没有让它发挥作用。任何帮助都将非常感激。

2 个答案:

答案 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>()得到一个实例,为什么你首先要嘲笑它?