【问题标题】:How to make a config file being copied into the test results directory while unit testing?如何在单元测试时将配置文件复制到测试结果目录中?
【发布时间】:2011-03-13 15:14:36
【问题描述】:

我已经编写了一些依赖于配置文件的单元测试。这个file.config 被部署到我的测试项目的bin\Debug 目录中。但是,它似乎并没有被复制到我的实际进行测试的输出测试结果目录中。

我已经搜索并找到了这些:
TFS UnitTesting not deploying local copy assembly to test dir when on build server
Test project and config file

第一个链接让我了解如何将我的配置文件部署到我的测试项目的bin\Debug 目录中。

第二个提出了一个可行的解决方案,虽然我觉得它对我的需求有点过头了,更不用说我给自己添加了一个类来测试等等。所以,我更喜欢一种更简单的方法,它可以让我拥有此配置文件自动复制到我的测试结果目录中。

编辑#1

我正在使用:

  1. Microsoft Enterprise Library 4.1 及其命名连接;与
  2. Microsoft Visual Studio 2008;和
  3. Microsoft 单元测试框架。

我的配置文件如下所示:

<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <dataConfiguration defaultDatabase="Tests" />
  <connectionStrings>
    <add name="Tests" connectionString="Database=Tests;Server=(local)\SQLEXPRESS;Integrated Security=SSPI"
        providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

并命名为:Tests.config

现在,我的项目设置包含一个 DefaultSource 参数,该参数包含默认源名称,即为其创建连接和数据库对象的名称。此设置的值为Tests

所以,当我创建一个新连接时,我只是这样做:

public static IDbConnection CreateConnection(string source) {
    return new DatabaseProviderFactory(new FileConfigurationSource(
            string.Format("{0}\{1}.config", AppDomain.CurrentDomain.BaseDirectory, source)
        ).CreateDefault().CreateConnection();
}

现在,由于返回了 AppDomain.CurrentDomain.Basedirectory 值,因此在单元测试时它无法正常工作。由于此属性不会返回程序集构建目录bin\Debug,而是返回实际运行测试的TestResults[auto-generated-test-results-directory]

所以,当我在测试时:

[TestMethod()]
public void Connection_InitializationWithSourceName() {
    using connection as IConnection = ConnectionProviderFactory.CreateConnection(DefaultSource) {
        // Asserts here... 
    } 
}

其中DefaultSource 属性将返回我的默认源设置参数,其值为Tests。因此,FileConfigurationSource 对象类将在测试实际运行的测试结果目录中搜索名为 Tests.config 的文件,如前所述。

知道怎么做吗?

谢谢! =)

【问题讨论】:

    标签: .net unit-testing testing configuration testrunconfig


    【解决方案1】:

    您为什么不向您的项目添加一个构建后事件,将文件复制到您喜欢的任何位置?

    【讨论】:

    • +1 这是一个绝妙的主意。我愿意这样做,前提是我可以计划转发每次测试运行自动生成的测试结果目录名称,即C:\MyProject.Tests\TestResults\[auto-generated-test-result-directory]\Out。这是 [auto-generated] 部分让我感到困惑并阻止能够复制后期构建。
    • 你至少有两个选择:要么弄清楚[auto-generated] 的工作原理,要么自己重建逻辑。或者,您将配置文件复制到具有类似C:\MyProject.Tests\TestResults\*\Out 的路径的任何子目录中。这意味着,您必须为复制任务编写一个小程序或脚本(我通常会为这类任务选择 VBScript,但您可以选择任何您喜欢的工具)。
    【解决方案2】:

    您可以将属性 [DeploymentItem] 添加到所有需要它的测试中,这会将您需要的任何文件部署到 out 文件夹。 http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=vs.80).aspx

    可以这样使用:

    [DeploymentItem("resources/my-file.ini")]
    [TestMethod()]
    public void Connection_InitializationWithSourceName() {
    

    或者你可以把它放在课堂上,如果你在课堂上的所有测试都需要它。

    【讨论】:

    • 我将在再次测试时尝试此选项,以便查看行为及其结果。感谢您的回复(+1)! =)
    • 这很好用,而且因为它很容易设置,所以 postbuild 事件 再简单不过了。我没有尝试过构建后事件,但除非您是构建专家,否则您可能必须首先弄清楚一些事情,例如变量等。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多