Общий ServiceLocator GetInstance

1

Я использую сборку 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>());   

Однако я не собираюсь работать. Любая помощь будет действительно оценена.

Теги:
moq
service-locator

2 ответа

2

Поскольку это статический экземпляр, вам нужно сначала установить его:

var mockS = new Mock<IServiceLocator>();
ServiceLocator.SetLocatorProvider(() => mockS.Object);

Затем вы можете писать настройки в экземпляре mock:

mockS.Setup(x => x.GetInstance<ISettings>()).Returns(settingsMock);

Вы не можете использовать метод It.IsAny для параметров типа.

0

Вам нужен общий метод:

void SetupGetInstance<T>(Mock<IServiceLocator> mock) 
{
   mock.Setup(x => x.GetInstance<T>()).Returns(ServiceLocator.Current.GetInstance<T>());   
}

И вызывать его для каждого компонента в вашем IoC, для которого вы хотите такую настройку. Но почему вы издеваетесь над этим в первую очередь, если во всех случаях вы просто получаете экземпляр через ServiceLocator.Current.GetInstance<T>()?

  • 0
    В некоторых случаях я хочу вернуть фиктивный объект, а во всех остальных случаях я хочу получить его через ServiceLocator.Current.GetInstance <T> ()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню