你如何指示NUnit从特定目录加载程序集的dll.config文件?

13

如果一个程序集包含一个 app.config 文件,只要它与通过 NUnit-Gui 执行的 NUnit 项目位于相同的目录中,ConfigurationManager 就会加载它。为了说明这一点,请考虑以下文件夹结构。

+ TestFolder
    testProject.nunit
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config
AssemblyAAssemblyB都会调用ConfigurationManager,如果我在NUnit-Gui中独立运行这些测试程序集,ConfigurationManager将正确解析本地配置文件。
然而,如果我将testProject.nunit加载到NUnit-Gui中(其中包含对AssemblyAAssemblyB的引用),ConfigurationManager将查找TestFolder中的配置文件,无论当前正在执行哪个程序集。
有没有办法指示NUnit重新加载应用程序配置为当前程序集目录中存在的配置?
下面是testProject.nunit的内容:
<NUnitProject>
  <Settings activeconfig="Debug" />
  <Config name="Debug" binpathtype="Auto">
    <assembly path="AssemblyAFolder\assemblyA.dll" />
    <assembly path="AssemblyBFolder\assemblyB.dll" />
  </Config>
</NUnitProject>

不是一个确切的答案,但你能否合并这两个配置文件并创建一个整个测试项目的配置文件? - TrueWill
幸运的是,在我的情况下,这应该可以工作,因为我正在每个程序集中读取不同的配置部分。我很好奇是否有更好或更通用的方法。 - Steve Guidi
5个回答

5

Nunit无法定位我们项目中App.config文件的路径。因此,我们需要手动告诉Nunit App.config文件在我们项目中的位置(显然是在根目录下)。

在我的情况下,项目结构如下所示:

     +ProjectWEBApp//web pages
       +Modules
         +aspx pages
       +web.Config

    +projectBusinesslogic //business logic .cs files
       +Modules
         +.cs

      +ProjectTestName// a seperate Nunit test cases project
        +Modules
      +App.Config

项目WebApp使用projectBusinesslogic的引用,其中包含业务逻辑。 +ProjectTestName使用projectBusinesslogic的引用来对业务逻辑进行测试。 问题从这里开始,Nunit测试项目需要自己的app.config文件。它不会像projectBusinesslogic一样使用web.config文件,所以当您运行Nunit时,它会提示错误。
-空引用异常.......对象实例未设置为...........
解决方案- 当您运行Nunit GUI时,
  1. 项目->编辑,将打开一个新的弹出窗口
  2. 属性->常规->配置文件名->添加您的app.config文件名
  3. 文件->保存并关闭弹出窗口
  4. Nunit Gui-文件->重新加载项目
这就是您问题的简单解决方案。

谢谢,你的步骤1-4就是所需的全部! - Flea

3
< p > configSource 元素 MarkLawrence提供的解决方案 是我正在寻找的,并且运行良好。然而,实现此解决方案的挑战在于,在从显式 NUnit 项目(如我的情况)运行测试时,以及在隔离程序集运行单元测试时加载程序集配置。为了实现这一点,需要对我的文件布局进行以下修改。

+ TestFolder
    testProject.nunit
    testProject.config
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
      assemblyA.dll.configfragment
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config
      assemblyB.dll.configfragment
configfragment文件是为了包含曾经在相应的config文件中的程序集配置而创建的。随后,config文件被修改为仅包含一个configSource元素,其中包含指向相应configfragment文件的相对路径。请注意,当assemblyA.dllassemblyB.dll都需要相同的配置部分时,这种方法无法工作,因为在创建testproject.config时会出现冲突。

在尝试了这种方法后,我决定依赖于在运行时生成程序集配置,并完全删除静态配置文件。以下是一些演示如何生成配置并使其可访问的代码,无论如何加载测试程序集。

void WithConfigurationFile(Action method)
{
    // Create the assembly configuration.
    string settingsSection = "myConfigSectionName";
    Configuration config =
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.Sections.Add(
        settingsSection,
        new ConfigSectionType(/*config element values*/);
    config.Save();

    try
    {
        // Invoke the method with the new configuration.
        ConfigurationManager.RefreshSection(settingsSection);
        method();
    }
    finally
    {
        // Revert the assembly configuration.
        File.Delete(config.FilePath);
        ConfigurationManager.RefreshSection(settingsSection);
    }
}

通过使用不接受路径的 ConfigurationManager.OpenExeConfiguration() 重载,我们可以从主机应用程序的工作目录加载配置,该目录根据您运行 NUnit 测试的方式而改变。此外,try/finally 块保证您的程序集配置不会干扰其他可能需要这样的配置的测试。
最后,在单元测试中使用:
[Test]
void VerifyFunctionality
{
    WithConfigurationFile(delegate
    {
        // implement unit test and assertions here
    });
}

我希望这能对那些遇到类似问题的人有所帮助!


2

在你的 .nunit 文件中,在 Config 级别中使用 configfile 属性:


<Config name="Debug" configfile="myconfigfilenamegoeshere.config />

该属性可以让你指定配置文件的名称和路径。

2
NUnit博客解释了为什么配置文件会以这种方式加载。基本上,他们说NUnit让框架处理配置文件,而不进行任何管理。
在您的情况下,您还可以使用testProject.config文件来引用每个程序集的配置文件。使用appSettings文件属性添加键。
最后一个选择是使用configSource元素属性来使用一个程序集配置文件中的部分。
希望这有所帮助。

0
实际上,如果您正在使用 NUnit 和 Visual Studio 中的运行器,则可以将值放入测试项目中的 App.config 中。然后在 Post-build 事件中添加以下行:
copy /Y “$(ProjectDir)App.config” “$(TargetDir)$(TargetFileName).config”
当您在测试中访问 ConfigurationManager 时,NUnit 将在初始化方法中将 app.config 中的值传递给 .Net。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接