« Lab Managment ~ VSTS 2010 の "1 Click Deploy" | トップページ | [Windows7] RC版 ~ フィードバックはどうなっているのか? »

2009年5月30日 (土)

[TDD の練習(5)] app.config を読み込んで保持していてくれるオブジェクト

ネタ元 ⇒ nunitのテストの仕方やメソッドの可視性

AppConfigクラス
  ConfigurationManagerクラスを使ってフィールドに値を格納するメソッド
  格納した値を検査するメソッド
このようなクラスを作成する場合、皆さんはどういうクラスにするのでしょうか?

え~、 実際にやってみたら、 掲示板に書いたのとは違って、 Validate() メソッドは消えてしまい、 setter で検証するカタチになっちゃいました f(^^;

ネタ元のほうで想定されている、 app.config 内の設定値はけっこうたくさんあるんだろうけど、 ここでは string の AppData01 と、 int の AppData02 の 2つだけだとします。
そのほか、 私のほうで想定した仕様は、 こんな感じ。
・ アプリケーションのどこからでも設定を参照したい。
・ アプリケーションの設定は app.config に入っているものを使う ( 当面は。 将来は DB とかから持ってくることがあるかもしれない。 )
・ 設定は読み出すだけ。 ( 当面は。 将来は app.config を書き換えたくなるかもしれない。 )
・ app.config の設定値が範囲外だったら、 アプリケーションが実行できてはいけない。 例外を出すこと。 ( AppData01 は not null であること。 AppData02 は 1 ~ 100 であること。 )

私は、 シングルトンパターンにしてみました。
今回は、 テストコードの説明が長くなるので、 テストコード AppConfigTest.cs 自体を読んでやってください。 テストコードは、 アタマから順番に読み進めてもらえるように書いたつもりです。 なお、 今回から C# 2008 Express + NUnit 2.5 になっています。 ソリューション一式はこちら → AppConfig_20090530.zip [20,964バイト]

以下は、 完成した AppConfig3 クラス。 ( ソリューションには、 途中経過状態の AppConfig1 と AppConfig2 も入っています。 )

public class AppConfig03
{
  private AppConfig03()
  {
    // (avoid instance)
  }

  private static AppConfig03 TheInstance;

  public static AppConfig03 GetInstance()
  {
    if (AppConfig03.TheInstance == null)
    {
      AppConfig03.TheInstance = new AppConfig03();
      AppConfig03.TheInstance.ReadConfig();
    }

    return AppConfig03.TheInstance;
  }

#if DEBUG
  internal static void TestDispose()
  {
    AppConfig03.TheInstance = null;
  }
#endif

  internal void ReadConfig()
  {
    NameValueCollection settings
        = ConfigurationManager.AppSettings;

    this.AppData01 = settings.Get("AppData01");
    this.AppData02 = int.Parse(settings.Get("AppData02"), CultureInfo.InvariantCulture);
  }


  private string _appData01;

  public string AppData01
  {
    get { return _appData01; }

    internal set {
      if (value == null)
        throw new ArgumentNullException("AppData01");

      _appData01 = value;
    }
  }

  private int _appData02;

  public int AppData02
  {
    get { return _appData02; }

    internal set {
      if (value < 1 || 100 < value)
        throw new ArgumentOutOfRangeException("AppData02");

      _appData02 = value;
    }
  }
}

 
# あ、 しまった。 ReadConfig() って internal にしちゃったけど、 private で構わないや。 f(^^;

|

« Lab Managment ~ VSTS 2010 の "1 Click Deploy" | トップページ | [Windows7] RC版 ~ フィードバックはどうなっているのか? »

プログラミング」カテゴリの記事

-プログラミング ( わんくま )」カテゴリの記事

コメント

あ~そうか。この手がありますね。
いや、config絡みのテストって書きにくいなとは常々思っていたんですけど、
これ応用して何か使えそうな予感が。

投稿: D | 2009年5月30日 (土) 23時00分

いやいや、 これが…
さらに、 ユーザーごとの設定とマシンの設定を絡めて、 優先順位付けして使おうなーんてことになると…
今読み込まれてるのは、 どのフォルダに置かれてる設定ファイルなのかを確認するだけで一苦労、 って事態に (;;

投稿: biac | 2009年5月30日 (土) 23時49分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/45179227

この記事へのトラックバック一覧です: [TDD の練習(5)] app.config を読み込んで保持していてくれるオブジェクト:

« Lab Managment ~ VSTS 2010 の "1 Click Deploy" | トップページ | [Windows7] RC版 ~ フィードバックはどうなっているのか? »