ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

This post kind-of 提出了这个问题,但作者确实从不同的角度看待它。

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


b
bbodenmiller

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

https://i.stack.imgur.com/Bl8Ss.png

https://i.stack.imgur.com/j0DWV.png


完美答案,简单客观! +1
这是最佳解决方案,应标记为答案。
要将现有项目“作为链接”添加,您应该:“在“添加现有项目”对话框中,找到并选择要链接的项目项目”,然后:“从“打开”按钮下拉列表中,选择“添加为链接”。 "
这对我很有用。我在想一个不起作用的情况……而且我现在已经想得够多了。谢谢!
J
Jeromy Irvine

执行此操作的最简单方法是在单元测试的部署部分中添加 .config 文件。

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

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

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


将 app.config 字段添加到测试项目要容易得多——然后您根本不需要使用 .testrunconfig。
@Rowland 如果你这样做,你必须维护 app.config 的两个副本。我宁愿花 10 秒一次,使用 .testrunconfig 工具,也不愿记住在两个地方都更新 app.config。
你不能只添加一个非复制参考吗? (添加现有项目...)
EFraim 的评论应该是公认的答案,这比其他任何事情都简单得多。
对于 EFraim 的解决方案:确保使用命令按钮中的“添加为链接”。否则你仍然会得到一份副本。此外,尽管该问题专门针对 .Net 应用程序,但这不适用于 Web 应用程序,因为 Web 应用程序的配置名称错误(Web.Config,而不是 App.Config)
d
dhinesh

无论您使用的是 Team System Test 还是 NUnit,最佳实践是为您的测试创建一个单独的类库。只需将 App.config 添加到您的测试项目中,编译时就会自动将其复制到您的 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());
     }
}

我同意在这里传递配置依赖项的精神,这似乎已经被 Mark Seemann 回答了!在这里:Failing unit tests due to missing .config file
该行缺少一个 ": string value = ConfigurationManager.AppSettings["TestValue];我试图修复它,但必须再找到 5 个字符来修复才能让 stackoverflow 允许我进行编辑。
J
Jeremy Thompson

如果您有一个包含例如 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 文件。感谢分享! :)
非常好的解决方案!非常感谢。
不错的解决方案,但是当主 web.config 仅引用同一项目中的外部 .config 文件时会发生什么。由于路径只能指向同一目录中的文件夹(通常是这样),因此在运行测试时,它将无法处理那些外部文件。知道如何解决吗?
这对我有用:复制 "$(SolutionDir)\MainProject\Web.config" "$(ProjectDir)app.config"
M
MichaelChan

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

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

H
Hari Das

这很容易。

右键单击您的测试项目

添加-->现有项目

您可以在“添加”按钮旁边看到一个小箭头

选择配置文件点击“添加为链接”


C
Cory Foy

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


我正在使用 VS08 Team System 进行单元测试,但感谢 NUnit 提示!
Z
Zyo

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

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

}

P
Patrick Desjardins

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


J
Jane

我无法得到任何这些建议来使用 nUnit 2.5.10,所以我最终使用 nUnit 的 Project -> Edit 功能来指定要定位的配置文件(正如其他人所说,它需要与 . nunit 文件本身)。这样做的积极方面是我可以给配置文件一个 Test.config 名称,这使它更清楚它是什么以及它为什么是)


B
Ben

https://i.stack.imgur.com/R55ng.png

https://i.stack.imgur.com/LMBYU.png

https://i.stack.imgur.com/GMWzI.png

https://i.stack.imgur.com/EqWxX.png

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

https://i.stack.imgur.com/kZehh.png