【问题标题】:ConfigurationManager.GetSection(sectionName) returns null while performing unit testsConfigurationManager.GetSection(sectionName) 在执行单元测试时返回 null
【发布时间】:2013-08-28 16:32:41
【问题描述】:

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

ConfigurationManager.GetSection(sectionName)

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

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

【问题讨论】:

  • 我每次运行测试项目时都会遇到与测试项目和 Sqlite 类似的问题,会创建一个新的 Sqlite 数据库,而主项目没有发生这种情况,所以为了测试我必须创建普通控制台application 而不是测试项目。我不知道这些信息是否有帮助 某些案例测试项目不是那么好 尤其是在处理外部资源时 更奇怪的是,我在使用 Visual 2010 时遇到了这个问题,但是当我升级到 2012 时,一切正常很好!!!
  • 我认为你只能有一个活动的配置文件,第一个是用于所有项目的,当你有正常的项目时,这是完成的,但在测试项目中它不是,所以复制(合并)所有项目的网络配置,看看它是否有效。
  • 所以你在一个单元测试项目中有一个app.config,而其他单元测试项目都依赖于那个app.config?这不是很可持续。我建议要么将该模拟 app.config 复制到每个测试项目,要么使用下面@Ouarzy 的模拟建议。它还取决于您要测试的内容:ConfigurationManager.GetSection() 调用或其他。

标签: c# .net configuration nunit configurationmanager


【解决方案1】:

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

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

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

(第二个更详细,思路还是一样的)。

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

【讨论】:

  • 这一切都很好,但是如果您要测试的是触及配置管理器的代码呢?我处于这种情况,我发现的所有建议都说我应该将 ConfigurationManager 从我的测试中抽象出来,但如果我这样做了,那么就没有什么可测试的了。
  • 如果您在抽象 ConfigurationManager 时没有要测试的内容,这表明您需要进行重构以实现更好的职责分离。
  • 与仅使用 ConfigurationManager 获取或更改值的类相比,您可以获得多少隔离,实现获取和设置配置值的接口?
  • 如果没有示例,我想这个讨论可能会很长 :) 如果你想在 ouarzy'at'free.fr 上与我联系,并通过 GitHub 分享一些代码,我们可以讨论它
【解决方案2】:

面对同样的问题,这解决了它: 如果 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 and app.config issue

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我使用了test project post build 命令行,但是如果有变化记得构建项目:

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

      【讨论】:

        猜你喜欢
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        • 2020-11-02
        • 1970-01-01
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多