ConfigurationManager.GetSection(sectionName)在执行单元测试时返回null

本文关键字:单元测试 返回 null 执行 GetSection sectionName ConfigurationManager | 更新日期: 2023-09-27 18:29:10

我有一个单元测试项目,它有自己的app.config文件,它是由正在测试的目标项目定义的真实配置文件的模拟。这个模拟文件是由单元测试代码(而不是目标项目)加载和处理的,如果我只在这个测试项目中运行测试,它就会正常工作。

ConfigurationManager.GetSection(sectionName)

然而,如果我从几个测试项目中运行测试,并且其他测试项目在相关项目之前执行,则上面的语句返回null。若所讨论的测试项目像第一个一样执行,加载配置文件并没有问题。

如何修复单元测试中配置文件的加载以正常工作?

ConfigurationManager.GetSection(sectionName)在执行单元测试时返回null

您的问题不是ConfigurationManager.GetSection(sectionName)返回null,而是如何测试一些包含ConfigurationManager.Get-Section(section Name)的代码?

答案是:包装它,注入它,然后为你的测试模拟它

您有几个pepole面临相同问题的例子:

  • http://chrisondotnet.com/2011/05/configurationmanager-wrapper-for-unit-testing/
  • http://weblogs.asp.net/rashid/archive/2009/03/03/unit-testable-configuration-manager.aspx

(第二个要详细得多,但想法还是一样的)。

无论如何,在单元测试中不能使用app.config中的信息是非常合乎逻辑的,因为当需要完全独立地编写测试时,app.config是整个应用程序的上下文。如果直接使用app.config值,则存在非逻辑耦合。

面对同样的问题,它解决了:如果Copy to Output Directory属性设置为Copy if newer或添加DeploymentItem属性[DeploymentItem("your.config")],则应在单元测试中拾取app.config

更详细的描述:http://social.msdn.microsoft.com/Forums/en-US/3e520735-8ced-4092-b681-38b69e0db534/unit-test-configuration#32998bf4-5a76-4083-99da-42f0c3a91559

类似的问题:MSTest和app.config发布

我认为问题要么是在测试工作目录中找不到文件,要么是文件本身加载失败。

我通过显式加载名为的配置文件解决了这个问题。在你们的情况下,你们也可以试试。

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = @"d:'test'test.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

我使用了测试项目后期构建命令行,但如果有更改,请记住构建项目:

copy /Y "$(SolutionDir)$(SolutionName)'App.Debug.config" "$(TargetDir)$(ProjectName)$(TargetExt).config"