2

我目前正在使用 Unity 和 MOQ 对 WCF 进行单元测试。在应用程序的代码中,我有以下内容:

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();  

谢谢!!

4

1 回答 1

3

是的,有可能。

您可以根据需要多次配置 Unity。如果存在冲突,则最近的定义获胜。

在您的情况下,如果您想进行运行时更改,请使用 fluent API 而不是配置文件。尝试这样的事情:

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

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

注册类型和类型映射的文档

于 2012-04-26T04:52:57.263 回答