首页 文章

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

提问于
浏览
134

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

当我尝试对使用任何配置属性的方法进行单元测试时,它们返回null . 我'm assuming this is because the unit test application is not going to load in the target application'的app.config .

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

This帖子有点问这个问题,但作者真的从一个不同的角度来看待它 .

EDIT: 我应该提一下,我正在使用VS08 Team System进行单元测试 .

11 回答

  • 81

    如果您有一个包含例如Web应用程序和测试项目的解决方案,您可能希望测试项目使用Web应用程序的web.config .

    解决此问题的一种方法是将web.config复制到测试项目并将其重命名为app.config .

    另一个更好的解决方案是修改构建链并使其自动复制web.config以测试项目输出目录 . 为此,请右键单击“测试应用程序”并选择属性 . 现在您应该看到项目属性 . 单击“构建事件”,然后单击“编辑构建后...”按钮 . 写下面的行到那里:

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

    然后单击确定 . (注意,您可能需要更改WebApplication1作为要测试的项目名称) . 如果你有错误的web.config路径,那么复制失败,你会在不成功的构建过程中注意到它 .

    Edit:

    要从当前项目复制到测试项目:

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

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

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

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

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

  • 0

    这很容易 .

    • 右键单击您的测试项目

    • 添加 - >现有项目

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

    • 选择配置文件点击"Add As Link"

  • 3

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

    Add Existing Item

    Add As Link

  • 5

    我使用 NUnit 并在我的项目目录中,我有一个App.Config的副本,我更改了一些配置(例如我重定向到测试数据库......) . 你需要在测试项目的 same directory 中拥有它,你会没事的 .

  • 2

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

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

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

  • 4

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

  • 7

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

    这有点旧,但我找到了更好的解决方案 . 我在这里尝试选择的答案,但看起来像.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");
    
  • 53

    我最近写了一篇关于如何对AppConfig进行单元测试的博客文章设置 . 希望这会有所帮助http://nileshgule.blogspot.com/2010/09/unit-test-application-configuration.html

相关问题