クラスに別のクラスのプロパティのスーパーセットがあるかどうかを判断するためのテストメソッドを作成するように努めています。これは、ドメインオブジェクトからビューモデルオブジェクトへのマッピングを目的としているため、2つのクラス間には関係がありません。
例として、ドメインクラスFoo
とビューモデルクラスがある場合、それを期待するプロパティを持つものFooMap
をテストしたいと思います。Foo
FooMap
public class Foo
{
public string Bar { get;set; }
public string Baz { get;set; }
public string NoOneCaresProp { get; set; }
public string GetBarBaz() { return Bar + Baz; }
}
public class FooMap
{
public string Bar { get; set; }
public string GetBarBaz { get; set; }
public string NotAFooProp { get; set; }
}
FooMap
このテストの目的でのプロパティが与えられた場合、クラスFoo
にBar
プロパティとGetBarBaz
メソッドがあることを確認したいと思います。いずれかのクラスの追加のメソッドまたはプロパティは無視する必要があります。このようなテストを実行するために次の静的メソッドを作成しましたが、実装に満足していません。
public static void ExpectedPropertiesExist<TSource, TDestination, R>(params
Expression<Func<TDestination, R>>[] exclude)
{
var excludedProperties = exclude.Select(e => (e.Body as
MemberExpression).Member.Name);
var mappedProperties = typeof(TDestination).GetProperties()
.Select(p => p.Name)
.Except(excludedProperties);
var sourceType = typeof(TSource);
var baseTypeNames = sourceType.GetProperties().Select(b => b.Name).ToList();
baseTypeNames.AddRange(sourceType.GetMethods().Select(b => b.Name));
Assert.IsTrue(new HashSet<string>(baseTypeNames)
.IsSupersetOf(mappedProperties));
}
上記を呼び出すコードは、私が望むほど簡潔ではありません。
// what my call to the function looks like now
TestExtensionFun.ExpectedPropertiesExist<Foo, FooMap,
object>(fm => fm.NotAFooProp);
// I'd prefer it to look like this
TestExtensionFun.ExpectedPropertiesExist<Foo, FooMap>(fm => fm.NotAFooProp);
また、その方法が可能な限り熟練しているとは思えません。クラスが別のクラスのプロパティのサブセットを持っていることを確認するための一般的なテストメソッドを作成するための最良のメカニズムは何ですか?