在测试项目中的App.config

32

我正在使用VS2010构建一个ASP.NET应用程序。我有许多不同的程序集(类库),以及每个程序集相应的测试项目。

在其中一个类库中,我使用App.config文件来存储设置。该程序集本身使用以下代码来检索设置:

 string tmp = ConfigurationManager.AppSettings["mySetting"];
问题在于,当我尝试在一个单独的测试项目中创建单元测试时,测试无法获取App.config文件中的设置。如果我将App.config文件复制到测试项目中,它就能正常工作了。
我该如何确保每个程序集使用自己的App.config文件副本?如果我不得不在不同的项目之间复制配置文件,这会带来问题。还有一个额外的问题,因为可能有多个配置文件,每个程序集一个 - 它们怎么可能共存于单个测试项目中呢?
谢谢!
3个回答

56

如果你需要在多个项目中共享一个 App.config 文件,我建议在每个项目中都添加原始的 App.config 文件,并将其设置为“链接添加”。

假设你有一个名为 ProjectA 的项目,其中包含原始的 App.config 文件。然后你还有 ProjectATest1ProjectATest2 两个项目。在每个TestX项目中:

  1. 在 Visual Studio 中右键单击解决方案名称
  2. 选择“添加现有项”
  3. 浏览到 ProjectA 中的 App.config 并选择它
  4. 点击“添加”按钮下拉箭头
  5. 选择“添加为链接”

这样会在每个 TestX 项目中创建一个 App.config 的快捷方式。如果你更改了该文件,它将在所有项目中进行更改。

希望能对你有所帮助。


1
+1 没有想到你可以在项目之间链接文件,这很好知道,但它会被正确处理和复制吗... - forsvarir
非常感谢。这似乎运行得非常好。很高兴得到直接的答案,而不仅仅是一个意见。 - jqwha
很高兴知道它有所帮助。导入_App.config_文件之间的设置还有其他方法,但当所有_App.config_文件应具有相同内容时,这是最简单和优雅的方法。我也在测试中使用它。 - nunaxe
顺便提一下,我正在主Web应用程序中引用配置文件。虽然我希望将设置隔离到每个程序集中,但我也意识到在当前技术限制下保持它们集中的必要性。我可能会尝试使用不同的方案来存储设置,以便真正隔离程序集行为。谢谢! - jqwha

6

首先,如果你正在进行单元测试,那么你可能想要考虑模拟配置,而不是读取它。

如果你真的想让配置可用(我过去已经这样做了集成测试),那么你可以为你的程序集添加一个后构建步骤(我假设一个程序集对应一个测试程序集)。

后构建步骤(在你的测试程序集上)可能看起来像这样:

  copy /y  "<path to your assembly under test>.dll.config" "$(TargetDir)\$(TargetName).dll.config"

实际上,你需要复制已被 Visual Studio 重命名的 app.config 文件,以匹配你正在测试的程序集的预期配置名称。


谢谢 - 如果我们需要这样做,我会记住的。在需要加快测试的非常特定的情况下可能会很有用。 - jqwha

3
不应该为程序集设置配置文件。如果这样做,每个应用程序都会有一个dll/引用项目对应的配置文件。
程序集从它们所加载的应用程序(Windows/Web)上下文中获取配置值。
因此,如果你有一个WebApp,程序集将使用WebApp的web.config文件来读取配置值。同样地,如果你有一个Windows应用程序/单元测试应用程序,库应该从app.config文件中读取值。
请阅读相关问题 - C#.NET Compiling the settings.settings file from various projects in a solution into 1 config file

1
我与安德鲁的对话中的评论似乎已经消失了。我的最初问题不是“如何拥有多个配置文件”,而是“如何使配置可从测试项目访问”。他接着解释为什么我根本不应该测试配置,这是不正确的。然后评论被删除了... - jqwha
1
我没有那个上下文,所以不能发表评论。无论如何,我建议使用单个配置文件。尽量避免对程序集使用配置文件。 - Tushar
顺便提一下,您是在暗示程序集应该在所有方面都独立于其配置,这是不正确的。理想情况下,程序集在所有方面都应该是完全自包含的。当我的ASP.NET应用程序利用程序集访问数据库时,配置哪个数据库的责任应该由程序集承担,而不是Web应用程序。这会渗透到维护和部署的所有方面。我知道这可能是.NET开发环境的缺陷,但您不能说这是正确的做法。 - jqwha
但是,安德鲁,我的评论呢?你没有说你要删除任何东西。算了吧,我得到了一个非常好的答案,来自一个懂行的人。 - jqwha
1
只是一个建议(不要误解)。如果我的连接字符串在程序集中定义,而数据库服务器发生更改 - 那我不就必须重新编译程序集了吗?人们会反向工程获取连接字符串和其他信息。无论如何,请随意使用您认为正确的方法:)。干杯! - Tushar
笑死了,安德鲁。所以,“操场策略”就这样了?我敢肯定你挣不了那么多钱:) 我想保持配置的精神,即防止重新编译或重新部署,允许管理员配置影响行为等。所有这些都要将与程序集相关的配置紧密地链接到程序集上。我并没有建议任何违反最佳实践的做法。我只是希望有一个可以解决所有问题的解决方案;-) - jqwha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接