Я использую сборку 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>());
Однако я не собираюсь работать. Любая помощь будет действительно оценена.
Поскольку это статический экземпляр, вам нужно сначала установить его:
var mockS = new Mock<IServiceLocator>();
ServiceLocator.SetLocatorProvider(() => mockS.Object);
Затем вы можете писать настройки в экземпляре mock:
mockS.Setup(x => x.GetInstance<ISettings>()).Returns(settingsMock);
Вы не можете использовать метод It.IsAny
для параметров типа.
Вам нужен общий метод:
void SetupGetInstance<T>(Mock<IServiceLocator> mock)
{
mock.Setup(x => x.GetInstance<T>()).Returns(ServiceLocator.Current.GetInstance<T>());
}
И вызывать его для каждого компонента в вашем IoC, для которого вы хотите такую настройку. Но почему вы издеваетесь над этим в первую очередь, если во всех случаях вы просто получаете экземпляр через ServiceLocator.Current.GetInstance<T>()
?