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

时间:2013-08-26 08:31:23

标签: c# .net configuration nunit configurationmanager

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

ConfigurationManager.GetSection(sectionName)

但是,如果我从多个测试项目运行测试,并且在相关项目之前执行其他测试项目,则上述语句将返回null。如果首先执行讨论的测试项目,则加载配置文件没有问题。

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

4 个答案:

答案 0 :(得分:8)

你的问题不是ConfigurationManager.GetSection(sectionName)返回null,我该如何测试一些包含ConfigurationManager.GetSection(sectionName)的代码?

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

你有几个人面临同样问题的例子:

(第二个更详细,但想法仍然相同)。

无论如何,在单元测试中你不能使用来自app.config的信息是合乎逻辑的,因为app.config是整个应用程序的上下文,当需要编写绝对独立的测试时。如果直接使用app.config值,则表示您具有非逻辑耦合。

答案 1 :(得分:2)

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

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

类似的问题:MSTest and app.config issue

答案 2 :(得分:1)

我认为问题是它无法在测试工作目录中找到该文件或文件本身无法加载。

我通过显式加载带有名称的配置文件解决了这个问题。在你的情况下,你可以尝试相同。

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

答案 3 :(得分:0)

我使用了测试项目post build命令行,但是如果有更改,请记得构建项目:

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