164

app.config ファイルを使用して構成プロパティを読み込む .NET アプリケーション (.exe) の単体テストを行っています。単体テスト アプリケーション自体には app.config ファイルがありません。

構成プロパティのいずれかを利用するメソッドを単体テストしようとすると、nullが返されます。これは、単体テスト アプリケーションがターゲット アプリケーションの app.config に読み込まれないためだと思います。

これをオーバーライドする方法はありますか、それともターゲットの app.config の内容をローカルの app.config にコピーするスクリプトを作成する必要がありますか?

この投稿は一種の質問ですが、著者は実際には私とは異なる角度から見ています.

編集:単体テストにVS08 Team Systemを使用していることに言及する必要があります。

4

11 に答える 11

125

Visual Studio 2008 では、app.configファイルが重複していないことを確認するために、ファイルを既存のアイテムとしてテスト プロジェクトに追加し、リンクとしてコピーを選択しました。そうすれば、ソリューションにはコピーが 1 つしかありません。複数のテスト プロジェクトを使用すると、非常に便利です。

既存のアイテムを追加

リンクとして追加

于 2009-10-06T22:27:25.960 に答える
64

これを行う最も簡単な方法は.config、単体テストの展開セクションにファイルを追加することです。

これを行うには.testrunconfig、ソリューション アイテムからファイルを開きます。Deployment セクションで、.configプロジェクトのビルド ディレクトリ (おそらくbin\Debug) から出力ファイルを追加します。

展開セクションにリストされているものはすべて、テストが実行される前にテスト プロジェクトの作業フォルダーにコピーされるため、構成に依存するコードは正常に実行されます。

編集:追加するのを忘れました。これはすべての状況で機能するとは限らないため.config、単体テストの名前と一致するように出力の名前を変更する起動スクリプトを含める必要がある場合があります。

于 2008-12-05T15:16:22.523 に答える
56

Team System TestまたはNUnitを使用しているかどうかにかかわらず、ベスト プラクティスは、テスト用に別のクラス ライブラリを作成することです。 Test プロジェクトに 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());
     }
}
于 2008-12-05T15:43:18.477 に答える
24

たとえば、Web アプリケーションとテスト プロジェクトを含むソリューションがある場合、おそらくテスト プロジェクトで Web アプリケーションの web.config を使用する必要があります。

これを解決する 1 つの方法は、web.config をテスト プロジェクトにコピーし、その名前を app.config に変更することです。

別のより良い解決策は、ビルド チェーンを変更し、web.config の自動コピーを作成してプロジェクトの出力ディレクトリをテストすることです。これを行うには、Test Application を右クリックし、プロパティを選択します。プロジェクトのプロパティが表示されます。[ビルド イベント] をクリックし、[ビルド後の編集...] ボタンをクリックします。そこに次の行を書き込みます。

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

[OK] をクリックします。(テストするプロジェクト名として、おそらく WebApplication1 を変更する必要があることに注意してください)。web.config へのパスが間違っていると、コピーが失敗し、ビルドが失敗したときに気付くでしょう。

編集:

現在のプロジェクトからテスト プロジェクトにコピーするには:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
于 2012-11-10T12:32:56.920 に答える
5

これはとても簡単です。

  • テスト プロジェクトを右クリックします。
  • 追加 --> 既存のアイテム
  • [追加] ボタンのすぐ横に小さな矢印が表示されます
  • 構成ファイルを選択し、[リンクとして追加] をクリックします。
于 2015-11-24T07:45:42.440 に答える
4

NUnit を使用している場合は、この投稿をご覧ください。基本的に、app.config を .nunit ファイルと同じディレクトリに置く必要があります。

于 2008-12-05T15:18:46.030 に答える
2

アプリケーションが Asp.net ConnectionString などの設定を使用している場合は、HostType 属性をメソッドに追加する必要があります。そうしないと、App.Config ファイルがあっても読み込まれません。

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

}
于 2013-07-30T14:01:09.717 に答える
0

私はNUnitを使用しており、私のプロジェクト ディレクトリには、一部の構成を変更する App.Config のコピーがあります (たとえば、テスト データベースにリダイレクトします...)。テストしたプロジェクトと同じディレクトリに置く必要があり、問題ありません。

于 2008-12-05T15:20:58.740 に答える
0

これらの提案を nUnit 2.5.10 で動作させることができなかったので、nUnit の [プロジェクト] -> [編集] 機能を使用して、ターゲットにする構成ファイルを指定することになりました (他の人は、. nunit ファイル自体)。これの良い面は、構成ファイルに Test.config という名前を付けて、その内容とその理由をより明確にすることができることです)

于 2012-10-29T13:07:01.353 に答える