WPFを使う-ViewModelとModel(1)で出たモデル側の単体テスト中のパラメータの範囲チェックで、当初はしこしこ一つのパラメータ毎にテストを書いていたのだが、ちょっと面倒になってきたので、共通化してみた。
モデル側のチェックについて
ここでは、Model側のパラメータ設定時にはチェックは行わず、Model側のcheckメソッドで一括チェックし、エラーが出たプロパティとそのエラー内容をDictionaryでもらうようにしていた。
共通化
一番多かった範囲チェックを以下のように共通化してみた。
static void isValidCheck(モデル test, string name, int min, int max) {
System.Reflection.PropertyInfo property = test.GetType().GetProperty(name);
property.SetValue(test, min);
Assert.AreEqual(test.IsValid().Count, 0);
property.SetValue(test, max);
Assert.AreEqual(test.IsValid().Count, 0);
property.SetValue(test, min - 1);
var result = test.IsValid();
Assert.AreEqual(result.Count, 1);
switch (Thread.CurrentThread.CurrentUICulture.Name) {
case "en":
Assert.AreEqual(result[name], string.Format("Please enter a value in the range: {1} - {2}.", 0, min, max));
break;
case "ja-JP":
Assert.AreEqual(result[name], string.Format("この値は{1}から{2}の範囲で入力してください。", 0, min, max));
break;
}
property.SetValue(test, max + 1);
result = test.IsValid();
Assert.AreEqual(result.Count, 1);
switch (Thread.CurrentThread.CurrentUICulture.Name) {
case "en":
Assert.AreEqual(result[name], string.Format("Please enter a value in the range: {1} - {2}.", 0, min, max));
break;
case "ja-JP":
Assert.AreEqual(result[name], string.Format("この値は{1}から{2}の範囲で入力してください。", 0, min, max));
break;
}
property.SetValue(test, min);
}
中身的には、Modelクラスのプロパティを探し、範囲の下限・上限を設定した場合には問題ないことを、範囲の下限・上限をちょっと外した値についてはエラーとなることを確認しているだけ。
呼び出し側は、次のようにしている。
isValidCheck(data, nameof(モデル.プロパティ1), 1, 6000);
isValidCheck(data, nameof(モデル.プロパティ2), 1, 3000);
これで、プロパティ1で1,6000の範囲チェック、プロパティ2で1,3000のチェックがされる。
最後に
本当はジェネリックを使いたかったのだが、足し算・引き算でエラーが出るので、ちょっとできなかった。
まあ、上限・下限の逸脱値を引数として与えるようにすればできるのだ。
コメント