代码之家  ›  专栏  ›  技术社区  ›  Jordan Parmer

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

  •  172
  • Jordan Parmer  · 技术社区  · 17 年前

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

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

    是否有方法覆盖此设置,或者我是否必须编写脚本将目标app.config的内容复制到本地app.config?

    This 这篇帖子有点问这个问题,但作者实际上是从一个与我不同的角度看待这个问题的。

    编辑: 我应该提到的是,我正在使用VS08团队系统进行单元测试。

    12 回复  |  直到 8 年前
        1
  •  124
  •   bbodenmiller    8 年前

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

    Add Existing Item

    Add As Link

        2
  •  64
  •   Jeromy Irvine    17 年前

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

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

    在运行测试之前,部署部分中列出的任何内容都将被复制到测试项目的工作文件夹中,因此依赖于配置的代码将正常运行。

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

        3
  •  55
  •   dhinesh    10 年前

    您是否正在使用 团队系统测试 单元测试 ,最佳做法是为测试创建一个单独的类库。 只需在测试项目中添加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());
         }
    }
    
        4
  •  24
  •   Jeremy Thompson    8 年前

    如果您有一个包含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"
    
        5
  •  10
  •   MichaelChan    9 年前

    这有点旧,但我找到了更好的解决方案。我在这里尝试了所选的答案,但看起来.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");
    
        6
  •  5
  •   Hari Das    10 年前

    这很容易。

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

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

        8
  •  2
  •   Zyo Stanley.Goldman    12 年前

    如果你的应用程序正在使用Asp.net ConnectionString等设置,你需要将HostType属性添加到你的方法中,否则即使你有一个应用程序,它们也不会加载。配置文件。

    [TestMethod]
    [HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
    public void Test() {
    
    }
    
        9
  •  0
  •   Patrick Desjardins    17 年前

    就我而言,我执行了以下步骤来解决我的问题。我使用的是Visual Studio Professional 2022、NUnit 3.13.3和。网6。

    1. 我添加了一个 App.config 根据建议将文件提交给测试项目,但 ConfigurationManager.AppSettings 仍然没有加载我的任何应用程序设置。

    2. 在我的单元测试中,我评估了 ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).FilePath 并确定它正在查找一个名为 testhost.dll.config

    3. 在单元测试项目中,我重命名了 App.config testhost.dll.config .

        10
  •  0
  •   Jane    13 年前

    我用 单元测试 在我的项目目录中,我有一个我的应用程序的副本。配置,我更改了一些配置(例如我重定向到测试数据库…)。你需要把它放在里面 同一目录 测试项目,你会没事的。

        11
  •  -1
  •   Ben    6 年前

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