如果程序集包含app.config文件,ConfigurationManager
将加载它,只要它与通过NUnit-Gui执行的NUnit项目位于同一目录中。为了说明,请考虑以下文件夹结构。
+ TestFolder
testProject.nunit
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
AssemblyA
和AssemblyB
都会调用调用ConfigurationManager
的代码。如果我在NUnit-Gui中独立运行这些测试程序集,ConfigurationManager
将正确解析本地配置文件。
但是,如果我将testProject.nunit
加载到NUnit-Gui(其中包含对AssemblyA
和AssemblyB
的引用),ConfigurationManager
将在{{1}中查找配置文件无论当前正在执行哪个程序集。
有没有办法指示NUnit将应用程序配置重新加载到当前程序集目录中的应用程序配置?
以下是TestFolder
的内容:
testProject.nunit
答案 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 :(得分: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.dll
和assemblyB.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。