単体テストプロジェクトは、ターゲットアプリケーションのapp.configファイルをロードできますか?


150

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

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

これを上書きする方法はありますか、またはターゲットapp.configのコンテンツをローカルapp.configにコピーするスクリプトを記述する必要がありますか?

この投稿はこの質問をしますが、作者は実際に私とは別の角度から見ています。

編集:私はユニットテストにVS08チームシステムを使用していることを言及する必要があります。

回答:


59

これを行う最も簡単な方法は.config、ユニットテストのデプロイメントセクションにファイルを追加することです。

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

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

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


9
テストプロジェクトにapp.configフィールドを追加する方がはるかに簡単です。.testrunco​​nfigをいじる必要はまったくありません。
Rowland Shaw、

13
@Rowlandその場合、app.configの2つのコピーを維持する必要があります。両方の場所でapp.configを更新することを覚えておく必要があるのではなく、.testrunco​​nfigツールを使用して、10秒を1回費やすほうがよいでしょう。
Jeromy Irvine、

66
コピーしない参照を追加することはできませんか?(既存のアイテムを追加...)
EFraim、

6
EFraimのコメントは受け入れられる答えである必要があります。これは他の何よりもはるかに簡単です。
reggaeguitar 14

28
EFraimのsolnの場合:コマンドボタンから[リンクとして追加]を必ず使用してください。それ以外の場合は、まだコピーを取得します。また、質問は.Netアプリ専用ですが、Webアプリの構成の名前が間違っているため(Web.Config、App.Configではない)、これはWebアプリでは機能しません
Rob Von Nesselrode

103

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

既存のアイテムを追加

リンクとして追加


7
完璧な答え、シンプルで客観的!+1
Custodio 2010

2
これは最良の解決策であり、答えとしてマークする必要があります。
niaher 2013年

4
既存のアイテムを「リンクとして」追加するには、「既存のアイテムの追加」ダイアログボックスで、リンクするプロジェクトアイテムを見つけて選択し、次に「開く」ボタンのドロップダウンリストから「リンクとして追加」を選択します。 」
uriel

これは私にとってはうまくいきました。それがうまくいかない状況を考えようとしている...そして今は十分考えた。ありがとう!
-Dudeman3000

53

Team System Testを使用している場合でも、NUnitを使用している場合でも、テスト用に個別のクラスライブラリを作成することをお勧めします。 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());
     }
}

2
ここで構成の依存関係を渡す精神に同意します。これは、Mark Seemannによって回答されたようです。こちら:.configファイルがないためにユニットテストが失敗する
Shaun

次の行に "がありません:文字列値= ConfigurationManager.AppSettings [" TestValue]; 私はそれを修正しようとしましたが、スタックオーバーフローを編集して編集できるようにするには、さらに5文字を修正する必要があったでしょう。
ジェーン

22

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

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

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

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"

本当に素晴らしい解決策。これにより、.configファイルのコピーや複製を回避できました。共有してくれてありがとう!:)
Leniel Maccaferri 14

とても良い解決策です!どうもありがとう。
Vin Shahrdar 2017年

素晴らしい解決策ですが、メインが同じプロジェクト内のweb.config外部.configファイルへの参照しか持っていない場合はどうなりますか。パスは同じディレクトリ(通常はtrue)内のフォルダーのみを指すことができるため、テストを実行すると、それらの外部ファイルを処理できなくなります。それを解決する方法はありますか?
Sugafree

これは私にとってはうまくいきました: "$(SolutionDir)\ MainProject \ Web.config" "$(ProjectDir)app.config"
Andrew

8

これは少し古いですが、これに対するより良い解決策を見つけました。ここで選択した答えを試しましたが、.testrunco​​nfigはすでに廃止されているようです。

1.単体テストの場合、構成をインターフェース(IConfig)でラップします

単体テストの場合、configは実際にはテストの一部ではないはずなので、注入できるモックを作成します。この例では、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");

5

これはとても簡単です。

  • テストプロジェクトを右クリック
  • 追加->既存のアイテム
  • 追加ボタンの横に小さな矢印が表示されます
  • 設定ファイルを選択し、「リンクとして追加」をクリックします


2

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

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

}

0

私はNUnitを使用ていて、プロジェクトディレクトリにApp.Configのコピーがあり、いくつかの構成を変更しています(例:テストデータベースにリダイレクトしています...)。あなたはそれを持っている必要があり、同じディレクトリテストプロジェクトの、あなたは罰金になります。


0

これらの提案をnUnit 2.5.10で機能させることができなかったので、最終的にnUnitのプロジェクト->編集機能を使用して、対象とする構成ファイルを指定しました(他のユーザーはと同じフォルダーにある必要があると言っています)。 nunitファイル自体)。これの良い面は、設定ファイルにTest.configの名前を付けることができることです。これにより、ファイルの内容と理由がより明確になります。


0

単体テストは、コードを実行してテストする環境と見なされます。通常の環境と同様に、ステージング/本番環境があります。.configテストプロジェクトのファイルも追加する必要がある場合があります。回避策は、クラスライブラリを作成し、NUnitやNUnitアダプターなどの必要なNuGetパッケージを追加して、それをテストプロジェクトに変換することです。Visual Studio Test RunnerとResharperの両方で完全に正常に動作app.configし、テストプロジェクトにファイルがあります。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

そして最後に私のテストと値をデバッグしましたApp.config

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.