4

app.config値を読み取るために使用する静的コンストラクターを持つクラスがあります。さまざまな構成値を使用してクラスを単体テストするにはどうすればよいですか。各テストを異なるアプリドメインで実行することを考えているので、各テストに対して静的コンストラクターを実行できますが、ここでは2つの問題があります:
1。各テストを別々のアプリドメインで実行する方法がわからない
2.方法実行時に構成設定を変更しますか?

誰かがこれを手伝ってくれませんか?または誰かがより良い解決策を持っていますか?ありがとう。

4

4 に答える 4

0

から読み取る場合(Web)ConfigurationManager.AppSettings、それは単なる NameValueCollection であるため、ConfigurationManager.AppSettings直接読み取るコードを任意の NameValueCollection から読み取るコードに置き換えることができます。

実際の構成解析を静的 ctor から静的メソッドに移動するだけです。静的 ctor はその静的メソッドを呼び出して を渡しConfigurationManager.AppSettingsますが、テスト コードからそのパーサー メソッドを呼び出して、実際にファイルに触れたり、appdomain をいじったりすることなく、構成の解析を確認できます。

しかし、長期的には、セルダリーが提案したように、構成パラメーターを実際に注入してください。構成クラスを作成し、アプリケーションの開始時に実際の値を読み取り、IoC コンテナーをセットアップして、すべてのリクエスターに同じ構成インスタンスを提供します。

クラスはグローバルな静的構成インスタンスから読み取らないため、これによりさらにテストが容易になります。別のテスト用に特定の構成インスタンスを渡すだけです。もちろん、グローバル構成を構築するために、テスト用のファクトリ メソッドを作成するので、常に手動で行う必要はありません...

于 2012-07-01T17:04:54.593 に答える
0

構成ファイルからデータをロードできる.Netをテストする必要はありません。
代わりに、独自のロジックのテストに集中してください。

コンストラクターから (またはプロパティを介して) 構成値を取得するようにクラスを変更し、他の依存関係と同じようにテストします。

途中で、クラスもSRPに移行しました。

構成の読み込みに従って、このロジックを別の非静的クラスに集中させます。


編集:
構成ロジックを別のクラスに分離します。このようなもの:

public static class ConfigurationLoader
{
    static ConfigurationLoader()
    {
        // Dependency1 = LoadFromConfiguration();
        // Dependency2 = LoadFromConfiguration();
    }

    public static int Dependency1 { get; private set; }
    public static string Dependency2 { get; private set; }
}

次に、クラスをインスタンス化するときに、依存関係を注入します。

public class MyClass
{
    private readonly int m_Dependency1;
    private readonly string m_Dependency2;

    public MyClass(int dependency1, string dependency2)
    {
        m_Dependency1 = dependency1;
        m_Dependency2 = dependency2;
    }

    public char MethodUnderTest()
    {
        if (m_Dependency1 > 42)
        {
            return m_Dependency2[0];
        }

        return ' ';
    }
}

public class MyClassTests
{
    [Fact]
    public void MethodUnderTest_dependency1is43AndDependency2isTest_ReturnsT()
    {
        var underTest = new MyClass(43, "Test");
        var result = underTest.MethodUnderTest();
        Assert.Equal('T', result);
    }
}

...

var myClass = new MyClass(ConfigurationLoader.Dependency1, ConfigurationLoader.Dependency2);

引き続き IOC コンテナーを使用することもできますが、MyClass をさまざまな入力でテストするという問題は、この単純なテスト可能な設計によって解決されます。

于 2012-07-01T06:30:23.607 に答える
0

個人的には、静的コンストラクターを静的メソッドに貼り付けてから、静的ブロックでそのメソッドを実行します。

于 2012-07-01T06:46:45.670 に答える