2012-04-26 3 views
1

В настоящее время я использую Unity с MOQ для выполнения моего модульного тестирования для WCF. В коде приложения, у меня есть следующие:Microsoft Unity - возможно ли изменить зарегистрированный тип во время выполнения?

private void MyMethod() 
{ 
..... 
..... 
    _proxy = new UnityContainer().LoadConfiguration().Resolve<IMyInterface>(); 
..... 
} 

В app.config приложения, я следующее:

<container> 
    <register type="IMyInterface" mapTo="MyActualObject" /> 
</container> 

В app.config модульного тестирования, я заменить, что с моей издеваться объектная реализация прокси.

<container> 
    <register type="IMyInterface" mapTo="MyMockObject" /> 
</container> 

Это все работает нормально. Но то, что я хотел бы сделать дальше, это определенные тесты, я хотел бы заменить MyMockObject другой реализацией макетного объекта.

Возможно ли изменение зарегистрированного типа во время выполнения? Я попытался изменить конфигурацию приложения во время выполнения, но не смог обнаружить изменение.

Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var section = (UnityConfigurationSection)appConfig.GetSection("unity"); 
section.Containers[0].Registrations[0].MapToName = "AnotherMockObject"; 
appConfig.Save(); 

Спасибо!

+0

Похоже, модифицируя конфигурационный файл во время выполнения будет работать. Мне просто нужно было обновить раздел, чтобы конфигурация не кэшировалась с помощью ConfigurationManager.RefreshSection («единство»). Но разве это единственный способ добиться того, что мне нужно? –

ответ

1

Да, это возможно.

Вы можете настроить Unity столько раз, сколько хотите. Если есть конфликт, выигрывает самое последнее определение.

В вашем случае, если вы хотите изменить время выполнения, используйте свободный API вместо файла конфигурации. Попробуйте что-то вроде этого:

IUnityContainer container = new UnityContainer(); 
container.LoadConfiguration(); 
container.RegisterType<IMyInterface, AnotherMockObject>(); 

// use AnotherMockObject 
_proxy = Resolve<IMyInterface>(); 

Документация для Registering Types and Type Mappings

+0

Но код для инициализации контейнера находится в коде приложения, а не в модульных тестах. Я хотел бы изменить тип в самом модульном тесте, и я не думаю, что создание RegisterType в контейнере применило бы такое же изменение ко всем контейнерам. –

+1

Похоже, что приложение не использует Unity правильно. Должен быть один экземпляр единственного «корня», который разрешает все объекты. Классы, которые вводятся, не должны создавать Unity (или, желательно, даже не знать об этом). Они должны получать зависимость через конструктор или инъекцию свойств. – ErnieL

+0

Не могли бы вы привести пример того, что вы имеете в виду? И как модульный тест имеет контроль над типом? –

Смежные вопросы