unit testing项目可以加载目标应用程序的app.config文件吗?

我正在testing使用app.config文件加载configuration属性的.NET应用程序(.exe)。 unit testing应用程序本身没有一个app.config文件。

当我尝试unit testing利用任何configuration属性的方法时,它们返回null 。 我假设这是因为unit testing应用程序不会加载目标应用程序的app.config。

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

这篇文章提出了这个问题,但作者真的是从另一个angular度来看待这个问题。

编辑:我应该提到,我正在使用VS08团队系统为我的unit testing。

最简单的方法是在unit testing的部署部分添加.config文件。

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

在运行testing之前,部署部分中列出的任何东西都将被复制到testing项目的工作文件夹中,所以依赖于configuration的代码将运行良好。

编辑:我忘了添加,这不会在所有情况下工作,所以你可能需要包括一个启动脚本,重命名输出.config配合unit testing的名称。

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

添加现有项目

添加为链接

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

如果你的代码依赖于特定的configurationtesting,我会写的第一个testingvalidationconfiguration文件是可用的( 这样我就知道我不是疯了 ):

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

和testing:

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

理想情况下,您应该编写代码,以便将configuration对象传递到您的类中。 这不仅将您从configuration文件问题中分离出来,而且还允许您针对不同的configurationscheme编写testing。

 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()); } } 

如果您有一个包含Web应用程序和testing项目的解决scheme,那么您可能希望该testing项目使用Web应用程序的web.config。

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

另一个更好的解决scheme是修改构build链并使其自动复制web.config以testing项目输出目录。 为此,请右键单击testing应用程序并select属性。 现在你应该看到项目属性。 点击“Build Events”,然后点击“Edit Post-build …”button。 写下面这行:

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

然后单击确定。 (注意,您可能需要更改WebApplication1作为您要testing的项目名称)。 如果你有错误的pathweb.config然后复制失败,你会注意到,在不成功的构build。

编辑:

从当前项目复制到testing项目:

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

这是有点老,但我find了一个更好的解决scheme。 我试图在这里select的答案,但看起来像.testrunco​​nfig已经过时。

1.对于unit testing,将configuration封装成一个接口(IConfig)

对于unit testing,configuration确实不应该是你的testing的一部分,所以创build一个模拟,你可以注入。 在这个例子中,我使用了Moq。

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

2.对于集成testing,dynamic添加您需要的configuration

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

我最近写了一篇关于如何unit testingAppConfig设置的博文。 希望这有助于http://nileshgule.blogspot.com/2010/09/unit-test-application-configuration.html

这很容易。

  • 右键单击您的testing项目
  • 添加 – >现有项目
  • 您可以在“添加”button旁边看到一个小箭头
  • selectconfiguration文件点击“添加为链接”

如果你使用NUnit,看看这个post 。 基本上你需要把你的app.config放在和你的.nunit文件相同的目录中。

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

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

我使用NUnit,并在我的项目目录中有一个我的App.Config副本,我改变了一些configuration(例如我redirect到testing数据库…)。 你需要把它放在testing项目的同一目录下,你会没事的。

我无法得到任何这些build议与nUnit 2.5.10的工作,所以我最终使用nUnit的项目 – >编辑function来指定configuration文件的目标(其他人已经表示,它需要在同一个文件夹作为。 nunit文件本身)。 这样做的积极的一面是我可以给configuration文件一个Test.config名称,这使得它更清楚它是什么以及为什么)