は、この課題への私の2セントです。単純に、新しいクラスAppSettingsを抽象レイヤーとして作成します。通常の操作では、アプリケーション設定ファイルから設定を読み込むだけです。しかし、単体テストは、スレッドごとの設定を上書きして、単体テストを異なる設定で並列実行することができます。ユニットテストで
function void MyApplicationMethod() {
string setting1 = AppSettings.Setting1;
string setting2 = AppSettings.Setting2;
}
、任意に選択されたオーバーライド設定:
[TestClass]
public class MyUnitTest
{
[TestCleanup]
public void CleanupTest()
{
//
// Clear any app settings that were applied for the current test runner thread.
//
AppSettings.Instance = null;
}
[TestMethod]
public void MyUnitMethod()
{
AppSettings.Instance = new AppSettings(setting1: "New settings value for current thread");
// Your test code goes here
}
}
注:アプリケーション・コードにおいて
internal sealed class AppSettings
{
private static readonly AppSettings instance;
private static ConcurrentDictionary<int, AppSettings> threadInstances;
private string _setting1;
private string _setting2;
static AppSettings() { instance = new AppSettings(); }
internal AppSettings(string setting1 = null, string setting2 = null) {
_setting1 = setting1 != null ? setting1 : Properties.Settings.Default.Setting1;
_setting2 = setting2 != null ? setting2 : Properties.Settings.Default.Setting2;
}
internal static AppSettings Instance {
get {
if (threadInstances != null) {
AppSettings threadInstance;
if (threadedInstances.TryGetValue(Thread.CurrentThread.ManagedThreadId, out threadInstance)) {
return threadInstance;
}
}
return instance;
}
set {
if (threadInstances == null) {
lock (instance) {
if (threadInstances == null) {
int numProcs = Environment.ProcessorCount;
int concurrencyLevel = numProcs * 2;
threadInstances = new ConcurrentDictionary<int, AppSettings>(concurrencyLevel, 5);
}
}
}
if (value != null) {
threadInstances.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, value, (key, oldValue) => value);
} else {
AppSettings threadInstance;
threadInstances.TryRemove(Thread.CurrentThread.ManagedThreadId, out threadInstance);
}
}
}
internal static string Setting1 => Instance._setting1;
internal static string Setting2 => Instance._setting2;
}
、アクセス設定は、静的プロパティを使用してのAppSettingsのすべてのメソッドとしてクラスが内部として宣言されている場合は、属性を使用してユニットテストアセンブリに表示させる必要があります。 [assembly:InternalsVisibleTo( "<アセンブリ名>、PublicKey = <公開鍵> ")]
ユースケースをよりよく説明できますか?実行時にtests.dll.configを変更する必要があるのはなぜですか? –
これはまさにこれと同じ質問です:http://stackoverflow.com/questions/168931/unit-testing-the-app-config-file-with-nunit –
OK、私はそれを閉じることができると思います。ポインタありがとう。 – FunLovinCoder