3

私はたくさん検索しましたが、これに対する確実な解決策を見つけることができませんでした。アプリケーションにメソッドがあるとします。このメソッドは、「System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration」を使用して、web.config の設定にアクセスします。これらのメソッドをテストしようとすると、テスト プロジェクトに web.config がないため、テストは失敗します。

この問題を解決する最善の方法は何ですか。単純な構成ファイルを使用するプロジェクトの場合、通常、このようなメソッドをファサード メソッドとして使用します。

public class Config
{
    public static String getKeyValue(String keyName)
    {
        if (keyName == String.Empty) return String.Empty;
        String result = "";

        System.Configuration.Configuration rootWebConfig1 =
           System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null);
        if (rootWebConfig1.AppSettings.Settings.Count > 0)
        {
            System.Configuration.KeyValueConfigurationElement reportEngineKey =
                rootWebConfig1.AppSettings.Settings[keyName];

            if (reportEngineKey != null)
            {
                result = reportEngineKey.Value;

            }

        }

        return result;
    }
}

OpenWebConfiguration( ) のパスを設定しようとするたびに、「相対仮想パスは許可されていません」というエラーが表示されました。

4

2 に答える 2

2

そのシナリオをよりテストしやすくするために、私は通常、自分自身の「設定マネージャー」を作成し、それにインターフェースを与えるというアプローチを取ります。したがって、たとえば:

public interface IConfig
{
    string GetSettingValue(string settingName);
}

次に、「実際の」実装を行うことができます。

public sealed class Config : IConfig
{
    public string GetSettingValue(string settingName)
    {
        // your code from your getKeyValue() method would go here
    }
}

次に、それを使用する私のコードは、これのインスタンスを取ります(これは依存性逆転の原則の例です):

public void DoStuff(IConfig configuration)
{
    string someSetting = configuration.GetSettingValue("ThatThingINeed");
    // use setting...
}

これで、本番コードについて、DoStuffのインスタンスを呼び出して渡すことができますConfig。テストが必要な場合は、モックツール(Moq、JustMock、RhinoMocksなど)を使用してIConfig、実際の.configファイルにアクセスせずに既知の値を返す偽物を作成できます。または、モックフレームワークなしで作成してモックを所有します(そしてそれらをテストプロジェクトに保存します)。

public class ConfigMock : IConfig
{
    private Dictionary<string, string> settings;

    public void SetSettingValue(string settingName, string value)
    {
        settings[settingName] = value;
    }

    public string GetSettingValue(string settingName)
    {
        return settings[settingName];
    }
}

[Test]
public void SomeExampleTest()
{
    var config = new ConfigMock();
    config.SetSettingValue("MySetting", "SomeValue");

    var underTest = new MyClass();
    underTest.DoStuff(config);
}
于 2012-05-14T17:15:15.683 に答える
0

これを行う最も簡単な方法は、moqなどのモック ライブラリを使用することです。それを理解するには少し時間がかかりますが、理解できれば、配管の大部分を抽象化して、反復可能で一貫性のあるテストに必要な値を返すことができます。

于 2012-05-14T16:59:34.900 に答える