[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(^^;
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
「-プログラミング ( わんくま )」カテゴリの記事
- [わんくま名古屋] 第21回: Metro サンプルコード解説 (1/3)(2012.04.15)
- [わんくま名古屋] 第21回は 4月 14日 - Windows 8 Metro をやるよ~♪(2012.04.12)
- [わんくま東京] 第59回の資料を公開しました(2011.06.02)
- [わんくま東京] 第59回は 5月 28日 - 名古屋から侵略します♪(2011.05.23)
- [わんくま名古屋] 第17回は 4月 9日 - TDD ネタで喋ります(2011.04.03)
この記事へのコメントは終了しました。
コメント
いやいや、 これが…
さらに、 ユーザーごとの設定とマシンの設定を絡めて、 優先順位付けして使おうなーんてことになると…
今読み込まれてるのは、 どのフォルダに置かれてる設定ファイルなのかを確認するだけで一苦労、 って事態に (;;
投稿: biac | 2009年5月30日 (土) 23時49分
あ~そうか。この手がありますね。
いや、config絡みのテストって書きにくいなとは常々思っていたんですけど、
これ応用して何か使えそうな予感が。
投稿: D | 2009年5月30日 (土) 23時00分