6

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

ConfigurationManager.GetSection(sectionName)

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

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

4

4 回答 4

9

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

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

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

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

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

于 2013-09-04T07:01:09.163 回答
2

面对同样的问题,这解决了它: 如果它的属性设置为或者如果您添加了 DeploymentItem 属性,则app.config应该在单元测试中选择它。Copy to Output DirectoryCopy 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 和 app.config 问题

于 2013-09-04T08:59:48.660 回答
1

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

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

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = @"d:\test\test.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
于 2013-09-09T08:01:16.320 回答
0

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

copy /Y "$(SolutionDir)$(SolutionName)\App.Debug.config" "$(TargetDir)$(ProjectName)$(TargetExt).config"
于 2017-08-31T20:22:07.747 回答