关于c#:单元测试项目可以加载目标应用程序的app.config文件吗?

Can a unit test project load the target application's app.config file?

我正在测试使用app.config文件加载配置属性的.NET应用程序(.exe)。单元测试应用程序本身没有app.config文件。

当我尝试对使用任何配置属性的方法进行单元测试时,它们返回空值。我假设这是因为单元测试应用程序不会加载到目标应用程序的app.config中。

有没有方法可以覆盖它,或者我需要编写一个脚本来将目标app.config的内容复制到本地app.config?

这篇文章提出了这个问题,但作者实际上是从不同的角度来看待这个问题的。

编辑:我应该提到我正在使用VS08团队系统进行单元测试。


在Visual Studio 2008中,我将app.config文件作为现有项添加到测试项目中,并选择"复制为链接",以确保该文件不被复制。这样我的解决方案中只有一个副本。有了几个测试项目,它真的很方便!

Add Existing Item

Add As Link


最简单的方法是在单元测试的部署部分添加.config文件。

为此,请从解决方案项中打开.testrunconfig文件。在部署部分,从项目的构建目录(大概是bin\Debug中)添加输出.config文件。

在运行测试之前,部署部分中列出的任何内容都将复制到测试项目的工作文件夹中,因此依赖于配置的代码将正常运行。

编辑:我忘了添加,这在所有情况下都不起作用,所以您可能需要包含一个启动脚本,它重命名输出.config以匹配单元测试的名称。


无论您使用的是团队系统测试还是nunit,最佳实践是为您的测试创建一个单独的类库。只需将app.config添加到测试项目中,编译时就会自动复制到bin文件夹中。

如果您的代码依赖于特定的配置测试,那么我编写的第一个测试将验证配置文件是否可用(这样我就知道我不是疯了)。:

1
2
3
4
5
<configuration>
   
       
   </appSettings>
</configuration>

测试:

1
2
3
4
5
6
7
8
9
10
[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value),"No App.Config found.");
     }
}

理想情况下,您应该编写代码,以便将配置对象传递到类中。这不仅将您从配置文件问题中分离出来,而且还允许您为不同的配置方案编写测试。

2


如果您有一个包含例如Web应用程序和测试项目的解决方案,您可能希望该测试项目使用Web应用程序的web.config。

解决这个问题的一种方法是复制web.config来测试项目,并将其重命名为app.config。

另一个更好的解决方案是修改构建链并使其自动复制web.config以测试项目输出目录。为此,右键单击测试应用程序并选择属性。现在您应该看到项目属性。单击"生成事件",然后单击"编辑生成后…"按钮。在那里写下以下几行:

1
copy"$(SolutionDir)\WebApplication1\web.config""$(ProjectDir)$(OutDir)$(TargetFileName).config"

然后点击确定。(注意,您最可能需要将WebApplication1更改为要测试的项目名称)。如果您有错误的web.config路径,那么复制会失败,并且在构建失败的过程中会注意到它。

编辑:

要从当前项目复制到测试项目,请执行以下操作:

1
copy"$(ProjectDir)bin\WebProject.dll.config""$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"


这有点旧,但我找到了更好的解决办法。我在这里尝试选择的答案,但看起来.testrunconfig已经过时了。

1。对于单元测试,包装配置是一个接口(IConfig)

对于单元测试,配置实际上不应该是测试的一部分,所以创建一个可以注入的模拟。在这个例子中,我使用的是moq。

1
2
3
Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2。对于集成测试,动态添加所需的配置

1
2
3
4
5
6
7
8
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");

如果你用的是Nunit,看看这个帖子。基本上,您需要将app.config与.nunit文件放在同一目录中。


这很容易。

  • 右键单击测试项目
  • 添加-->现有项
  • 在"添加"按钮旁边可以看到一个小箭头
  • 选择配置文件,点击"添加为链接"

如果应用程序正在使用诸如ASP.NET ConnectionString之类的设置,则需要将属性hostType添加到方法中,否则即使您有app.config文件,它们也不会加载。

1
2
3
4
5
[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}

我无法得到这些建议中的任何一个与nunit 2.5.10一起工作,所以我最终使用了nunit的project->edit功能来指定目标配置文件(正如其他人所说,它需要与.nunit文件本身在同一个文件夹中)。积极的一面是,我可以给配置文件一个test.config名称,这使得它更清楚地说明了它是什么以及为什么是它)


我使用nunit,在我的项目目录中,我有一个app.config的副本,我更改了一些配置(例如,我重定向到一个测试数据库…)。您需要将它放在测试项目的同一个目录中,这样您就可以了。