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


150

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

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

有没有一种方法可以覆盖此问题,或者我必须编写脚本将目标app.config的内容复制到本地app.config?

这篇文章提出了这个问题,但作者确实从与我不同的角度看待它。

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

Answers:


59

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

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

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

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


9
只需将app.config字段添加到测试项目中会容易得多,那么您根本不需要使用.testrunco​​nfig。
罗兰·肖

13
@Rowland如果这样做,则必须维护两个app.config副本。我宁愿花10秒钟一次使用.testrunco​​nfig工具,而不必记得在两个地方都更新app.config。
Jeromy Irvine

66
您不能添加非复制参考吗?(添加现有项...)
EFraim 2010年

6
EFraim的评论应该是公认的答案,这比其他任何事情都要简单得多。
reggaeguitar 2014年

28
对于EFraim的解决方案:确保使用命令按钮中的“添加为链接”。否则,您仍然会得到一份副本。另外,尽管该问题专门针对.Net应用,但不适用于Web应用,因为Web应用的配置名称错误(Web.Config,而不是App.Config)
Rob Von Nesselrode

103

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

添加现有项目

添加为链接


7
完美的答案,简单而客观!+1
Custodio

2
这是最好的解决方案,应将其标记为答案。
niaher

4
对于“作为链接”添加现有项,您应该:“在“添加现有项”对话框中,找到并选择要链接的项目项”,然后:“从“打开”按钮下拉列表中,选择“添加为链接”。 ”
uriel

这对我来说很棒。我正在尝试一种无法正常工作的情况...现在我已经考虑够了。谢谢!
Dudeman3000

53

无论您使用的是Team System Test还是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());
     }
}

2
我同意在此处传递配置依赖项的精神,这似乎已经得到马克·西曼的解答了!在这里:由于缺少.config文件而导致单元测试失败
Shaun 2012年

该行中缺少“:字符串值= ConfigurationManager.AppSettings [“ TestValue]; 我试图对其进行修复,但必须另找5个字符进行修复,以使stackoverflow允许我进行编辑。

22

如果您有一个包含例如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"

真的很好的解决方案。这有助于我避免复制和复制.config文件。感谢分享!:)
Leniel Maccaferri 2014年

非常好的解决方案!非常感谢。
Vin Shahrdar,2017年

不错的解决方案,但是当主项目web.config仅引用.config同一项目中的外部文件时会发生什么。由于该路径只能指向同一目录中的文件夹(通常是正确的),因此在运行测试时,它将无法处理这些外部文件。知道如何解决吗?
Sugafree

这对我有用:复制“ $(SolutionDir)\ MainProject \ Web.config”“ $(ProjectDir)app.config”
Andrew

8

这有点旧,但是我为此找到了更好的解决方案。我在这里尝试选择的答案,但看起来.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

这很容易。

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


2

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

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

}

0

我使用NUnit,并且在项目目录中有我的App.Config副本,可以更改一些配置(例如,我重定向到测试数据库...)。您需要将其放在测试项目的同一目录中,这样就可以了。


0

我无法从nUnit 2.5.10中获得任何这些建议,因此我最终使用了nUnit的Project-> Edit功能来指定要定位的配置文件(因为其他人已经说过,它需要与放在同一个文件夹中)。 nunit文件本身)。积极的一面是,我可以为config文件指定一个Test.config名称,以便更清楚地知道其含义和原因。


0

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

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

最后从App.config以下命令调试了我的测试和价值:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.