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中,我将
最简单的方法是在单元测试的部署部分添加
为此,请从解决方案项中打开
在运行测试之前,部署部分中列出的任何内容都将复制到测试项目的工作文件夹中,因此依赖于配置的代码将正常运行。
编辑:我忘了添加,这在所有情况下都不起作用,所以您可能需要包含一个启动脚本,它重命名输出
无论您使用的是团队系统测试还是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的副本,我更改了一些配置(例如,我重定向到一个测试数据库…)。您需要将它放在测试项目的同一个目录中,这样您就可以了。