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

时间:2008-12-05 15:01:36

标签: c# .net unit-testing app-config

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

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

有没有办法覆盖这个或者我是否必须编写脚本来将目标app.config的内容复制到本地app.config?

This帖子有点问这个问题,但作者真的从一个不同的角度来看待它。

编辑:我应该提一下,我正在使用VS08 Team System进行单元测试。

11 个答案:

答案 0 :(得分:88)

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

Add Existing Item

Add As Link

答案 1 :(得分:55)

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

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

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

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

答案 2 :(得分:53)

无论您使用的是 Team System测试还是 NUnit ,最佳做法是为测试创建单独的类库。 在编译时,只需将App.config添加到Test项目中就会自动复制到bin文件夹中。

如果你的代码依赖于特定的配置测试,那么我要编写的第一个测试验证配置文件是否可用(以便我知道我不是疯了) :

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

测试:

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

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

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}

答案 3 :(得分:19)

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

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

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

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

然后单击“确定”。 (注意,您可能需要更改WebApplication1,因为您要测试项目名称)。如果你有错误的web.config路径,那么复制失败,你会在构建失败时注意到它。

修改

从当前项目复制到测试项目:

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

答案 4 :(得分:7)

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

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

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

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

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

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");

答案 5 :(得分:4)

如果您使用的是NUnit,请查看this post。基本上,您需要将app.config与.nunit文件放在同一目录中。

答案 6 :(得分:3)

这很容易。

  • 右键单击您的测试项目
  • 添加 - &gt;现有项目
  • 您可以在“添加”按钮旁边看到一个小箭头
  • 选择配置文件,然后单击&#34;添加为链接&#34;

答案 7 :(得分:2)

如果您的应用程序正在使用Asp.net ConnectionString等设置,则需要将属性HostType添加到您的方法中,否则即使您有App.Config文件它们也不会加载。

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

}

答案 8 :(得分:0)

我使用 NUnit ,在我的项目目录中,我有一个App.Config的副本,我更改了一些配置(例如我重定向到测试数据库......)。你需要在测试项目的相同目录中拥有它,你会没事的。

答案 9 :(得分:0)

我无法使用nUnit 2.5.10获得任何这些建议,因此我最终使用了nUnit的项目 - &gt;编辑功能以指定要定位的配置文件(正如其他人所说,它需要与.nunit文件本身位于同一文件夹中)。这方面的积极方面是我可以为配置文件提供一个Test.config名称,这样可以更清楚地了解它是什么以及为什么会这样做。

答案 10 :(得分:0)

您的单元测试被认为是运行代码进行测试的环境。就像任何正常环境一样,您可以进行登台/生产。您可能还需要为测试项目添加一个.config文件。一种解决方法是通过添加必要的NuGet包(例如NUnit和NUnit Adapter)来创建类库并将其转换为Test Project。它可以与Visual Studio Test Runner和Resharper完美配合,并且您的app.config文件在测试项目中。 enter image description here

enter image description here

enter image description here

enter image description here

最后从App.config调试了我的测试和值:

enter image description here