単体テスト-パラメータ類のチェック

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のチェックがされる。

最後に

本当はジェネリックを使いたかったのだが、足し算・引き算でエラーが出るので、ちょっとできなかった。

まあ、上限・下限の逸脱値を引数として与えるようにすればできるのだ。

コメント

タイトルとURLをコピーしました