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

时间:2009-09-11 17:22:17

标签: .net unit-testing nunit app-config configurationmanager

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

+ 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将在{{1}中查找配置文件无论当前正在执行哪个程序集。

有没有办法指示NUnit将应用程序配置重新加载到当前程序集目录中的应用程序配置?

以下是TestFolder的内容:

testProject.nunit

5 个答案:

答案 0 :(得分: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

ProjectWebApp使用包含业务逻辑的projectBusinesslogic的引用。 + ProjectTestName使用projectBusinesslogic的引用来对业务逻辑执行测试。 问题从这里开始,Nunit测试项目需要自己的app.config文件。它不会像projectBusinesslogic一样使用web.config文件,因此当你运行Nunit时它会提示错误

  

-Null参考异常.......对象瞬间未设置为...........

溶液 - 当您运行Nunit GUI

  1. 项目 - >编辑新的弹出窗口将打开
  2. 属性 - >一般 - >配置文件名 - >添加 app.config 文件名
  3. 文件 - >保存并关闭弹出窗口
  4. ON Nunit Gui-File->重新加载项目
  5. 这是解决问题的简单方法

答案 1 :(得分:3)

configSource元素solution given by MarkLawrence正是我所寻找的,并且效果很好。然而,实现此解决方案的挑战是在从显式NUnit项目(如my case)运行测试时,以及在隔离运行单元测试时(无显式项目),使组件配置加载。为此,需要对我的文件布局进行以下修改。

+ 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 :(得分:2)

NUnit博客解释了配置文件加载方式的原因。基本上他们所说的是NUnit让框架处理配置文件而不进行任何管理。

您还可以使用将在您的案例中加载的testProject.config文件来引用每个程序集的配置文件。使用appSettings文件属性添加键。

最后一种方法是使用configSource element attribute来使用其中一个程序集配置文件中的部分。

希望这有帮助。

答案 3 :(得分:2)

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


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

答案 4 :(得分:0)

实际上,如果您在Visual Studio中使用NUnit和一个跑步者,您可以将您的价值放在测试项目的App.config中。然后将此行添加到Post-build事件:

copy / Y“$(ProjectDir)App.config”“$(TargetDir)$(TargetFileName).config”

在测试中访问ConfigurationManager时,NUnit会在初始化方法中将app.config中的值传递给.Net。