2011-03-13 3 views
4

設定ファイルに依存する単体テストを書きました。この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ディレクトリに私の設定ファイルを展開する方法を見つけることができました。

2番目の方法では解決策が示されますが、自分のニーズに少し不満があります。テストするクラスなどを追加する必要はありません。この設定ファイルをテスト結果ディレクトリに自動的にコピーしてください。

EDIT#1

私が使用している:

  1. マイクロソフトエンタープライズライブラリ4.1の名前付き接続と一緒に。 with
  2. Microsoft Visual Studio 2008;および
  3. 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> 
    

    と命名されています: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]です。だから、

、私のテストでは、私が行います

DefaultSourceプロパティ値が Testsである私のデフォルトソースの設定パラメータを返します
[TestMethod()] 
public void Connection_InitializationWithSourceName() { 
    using connection as IConnection = ConnectionProviderFactory.CreateConnection(DefaultSource) { 
     // Asserts here... 
    } 
} 

を。したがって、FileConfigurationSourceオブジェクトクラスは、前述のように、テストが実際に実行されるテスト結果ディレクトリでTests.configというファイルを検索します。

どうすればいいですか?

ありがとうございます!=)

答えて

5

好きな場所にファイルをコピーするポストビルドイベントをプロジェクトに追加してみませんか?

+0

+1これは素晴らしい考えです。そして、テスト実行時に自動的に生成されるテスト結果ディレクトリ名、つまり 'C:\ MyProject.Tests \ TestResults \ [auto-generated-test-result-directory ] \ Out'。これは、私を混乱させ、ポストビルドをコピーできないようにする '[自動生成]'の部分です。 –

+0

少なくとも2つのオプションがあります:この '[自動生成された]'がどのように動作し、自分でロジックを再構築するかを決定します。あるいは、 'C:\ MyProject.Tests \ TestResults \ * \ Out'のようなパスを持つサブディレクトリにconfigファイルをコピーします。つまり、コピーするタスク用の小さなプログラムやスクリプトを作成する必要があります(通常、そのようなタスクにはVBScriptを選択しますが、そのために好きなツールを選択することができます)。 –

4

属性[DeploymentItem]を必要とするすべてのテストに属性を追加できます。これにより、必要なファイルをすべてアウトフォルダーに展開できます。 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() { 

それとも、そのクラスのすべてのテストのためにそれが必要な場合は、クラスにそれを置くことができます。

+0

もう一度テストするときにこのオプションを試して、その動作とその結果を見ることができます。あなたの返信ありがとうございます(+1)! =) –

+0

これは素晴らしく、セットアップが簡単なので、postbuildイベント*は簡単にはできません。 postbuildイベントは試していませんが、ビルドエキスパートでなければ、まず変数などのようなものをいくつか見つけなければならないでしょう。 –

関連する問題