NUnitでapp.configファイルを単体テストする
-
05-07-2019 - |
質問
皆さんがapp.configファイルの値に依存するアプリケーションを単体テストしている場合これらの値が正しく読み込まれること、および構成ファイルに入力された誤った値に対するプログラムの反応をどのようにテストしますか?
NUnitアプリの構成ファイルを変更するのはばかげているでしょうが、テストしたいapp.configから値を読み取ることができません。
編集:明確にする必要があると思います。 ConfigurationManagerが値の読み取りに失敗することは心配していませんが、読み取った値に対するプログラムの反応をテストすることに関心があります。
解決
私は通常、機能がほとんどない独自のファサードクラスで設定ファイルを読み取るなど、外部の依存関係を分離します。テストでは、実際の設定ファイルの代わりにそれを実装して使用するこのクラスのモックバージョンを作成できます。独自のモックアップを作成するか、moqやrhino mocksなどのフレームワークを使用できます。
この方法により、最初にxml-configurationファイルを作成する複雑なテストを作成することなく、異なる設定値でコードを簡単に試すことができます。通常、構成を読み取るコードは非常に単純なので、テストはほとんど必要ありません。
他のヒント
テストセットアップで実行時に構成セクションを変更できます。例:
// setup
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");
// carry out test ...
もちろん、独自のヘルパーメソッドをセットアップして、これをよりエレガントに行うことができます。
ConfigurationManager.AppSettingsのsetメソッドを呼び出して、特定の単体テストに必要な値を設定できます。
[SetUp]
public void SetUp()
{
ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
// rest of unit test code follows
}
単体テストを実行すると、これらの値を使用してコードが実行されます
ConfigurationManager
クラスを使用して、 app.config
ファイルを読み書きできます
web.configで同様の問題に直面していました...興味深い解決策を見つけました。設定読み取り機能をカプセル化できます。このようなもの:
public class MyClass {
public static Func<string, string>
GetConfigValue = s => ConfigurationManager.AppSettings[s];
//...
}
そして通常使用します
string connectionString = MyClass.GetConfigValue("myConfigValue");
ただし、単体テストでは&quot; override&quot;を初期化します。このような関数:
MyClass.GetConfigValue = s => s == "myConfigValue" ? "Hi", "string.Empty";
詳細:
http:// rogeralsing。 com / 2009/05/07 / the-simplest-form-of-of-configurable-dependency-injection /
よりエレガントな解決策は、構成設定自体に単純な古い依存性注入を使用することです。私見これは、設定読み取りクラス/ラッパーなどをモックするよりもきれいです。
たとえば、クラス「天気」を言います; &quot; ServiceUrl&quot;が必要です。機能するために(たとえば、天気を取得するためにWebサービスを呼び出すなど)。構成ファイルにアクティブに移動してその設定を取得するコード行を持たせるのではなく(そのコードがWeatherクラスにあるか、他の応答のいくつかに従ってモックされる可能性のある別の構成リーダーに関係なく)、Weatherクラスはコンストラクターのパラメーターを介して、または場合によってはプロパティセッターを介して、注入される設定。そうすれば、単体テストは非常にシンプルで直接的なものになり、モックも必要ありません。
設定の値は、Inversion of Control(またはDependency Injection)コンテナーを使用して注入できるため、Weatherクラスのコンシューマーは、コンテナーによって処理されるため、どこかから明示的に値を提供する必要はありません。
それは私のために働いた:
public static void BasicSetup()
{
ConnectionStringSettings connectionStringSettings =
new ConnectionStringSettings();
connectionStringSettings.Name = "testmasterconnection";
connectionStringSettings.ConnectionString =
"server=localhost;user=some;database=some;port=3306;";
ConfigurationManager.ConnectionStrings.Clear();
ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
}
インターフェイスで読み込みビットをいつでもラップし、設定ファイルから特定の実装を読み込むことができます。次に、モックオブジェクトを使用してテストを記述し、プログラムが不正な値をどのように処理したかを確認します。 個人的には、これは.NET Frameworkコードであるため、この特定の実装をテストしません(MSが既にテストしていることを願っています)。
System.Configuration.Abstractionsは、この種のものをテストすることに関しては素晴らしいものです。
GitHubプロジェクトサイトには、いくつかの良い例があります:ここにリンクの説明を入力
NuGetサイトは次のとおりです。 https://www.nuget.org/packages /System.Configuration.Abstractions/
.NETプロジェクトのほぼすべてでこれを使用しています。
実際、さらに考えて、プロジェクトで使用するConfigFileReaderクラスを作成し、ユニットテストハーネスで偽造する必要があると思いますか>
それは通常のことですか?
最も簡単なオプションは、設定を読み取るメソッドをラップして、テスト中に値を置換できるようにすることです。 configの読み取りに使用するインターフェイスを作成し、そのインターフェイスの実装をコンストラクターパラメーターとして渡すか、オブジェクトにプロパティとして設定します(依存関係の挿入/制御の反転を使用する場合と同様)。実稼働環境では、実際に構成から読み取る実装を渡します。テスト環境で、既知の値を返すテスト実装を渡します。
テストしやすいようにコードをリファクタリングするオプションがなく、まだテストする必要がある場合、Typemock Isolatorは、。 such-and-such appSettings値、この既知の値を返します。&quot;
同じ問題がありました
Nunit-console.exe c:\ path1 \ testdll1.dll c:\ path2 \ testdll2.dllを使用できます
これは、両方のdllが異なるapp.configsを指している場合でも正常に機能します ex testdll1.dll.configおよびtestdll2.dll.config
Nunitプロジェクトの構成を使用してこれらの2つのdllをラップする場合、2つの構成を使用する方法はありません
NunitプロジェクトがProject1.nunitが置かれているのと同じ場所にあるproject1.nunitである場合、project1.configが必要です。
これが役立つことを願って
まあ、私は同じ問題を抱えていた... Webサイトから参照されるBLプロジェクトをテストしたかった。 しかし、私はBLのみをテストしたかった。そのため、テストプロジェクトのビルド前イベントで、app.Configファイルをbin \ debugフォルダーにコピーし、app.configから参照します...