如何在单元测试时使配置文件被复制到测试结果目录中?

4
我编写了一些单元测试,它们依赖于配置文件。这个file.config文件被部署到我的测试项目的bin\Debug目录中。然而,在实际进行测试的输出测试结果目录中似乎没有复制该文件。
我已经搜索并找到了以下信息:
TFS UnitTesting无法在构建服务器上将本地副本程序集部署到测试目录
测试项目和配置文件 第一个链接让我找到了如何将我的配置文件部署到测试项目的bin\Debug目录中。
第二个链接提供了一种可行的解决方案,尽管我认为它有点过度设计,并且需要添加一个用于测试的类等等。因此,我更倾向于使用一个简单的方法,可以自动将该配置文件复制到我的测试结果目录中。
注:我正在使用Microsoft Enterprise Library 4.1 和它的命名连接、Microsoft Visual Studio 2008以及Microsoft UnitTest Framework。我的配置文件如下:
<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>

现在,我的项目设置包含一个 DefaultSource 参数,它包含默认源名称,也就是用于创建连接和数据库对象的源。该设置的值为 Tests

因此,当我创建新连接时,只需要这样做:

并且命名为:Tests.config

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[自动生成的测试结果目录]
所以,当我在我的测试中执行以下操作时:
[TestMethod()]
public void Connection_InitializationWithSourceName() {
    using connection as IConnection = ConnectionProviderFactory.CreateConnection(DefaultSource) {
        // Asserts here... 
    } 
}

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

有任何想法吗?

谢谢!=)

2个回答

5
为什么不在你的项目中添加一个 postbuild 事件,将文件复制到任何你喜欢的地方呢?

+1 这是一个非常棒的想法。如果我能提前规划测试结果目录名称,即 C:\MyProject.Tests\TestResults\[auto-generated-test-result-directory]\Out,那么我也想这样做。问题在于 [auto-generated] 部分让我感到困惑,并且无法在构建后进行复制。 - Will Marcouiller
你至少有两个选择:要么弄清楚这个 [auto-generated] 的东西是如何工作的,然后自己重建逻辑。或者你可以将配置文件复制到任何子目录中,路径类似于 C:\MyProject.Tests\TestResults\*\Out。这意味着,你需要编写一个小程序或脚本来完成复制任务(我通常会选择 VBScript 来完成这些任务,但你可以选择任何你喜欢的工具)。 - Doc Brown

4

我将在下次测试时尝试这个选项,以便我可以看到它的行为和结果。谢谢你的回复(+1)!=) - Will Marcouiller
这个非常好用,而且设置起来非常容易,postbuild事件简直再简单不过了。我还没有尝试过postbuild事件,但除非你是一个构建专家,否则你可能需要先弄清楚一些东西,比如变量等。 - Evgeniy Berezovsky

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