1

クラスに別のクラスのプロパティのスーパーセットがあるかどうかを判断するためのテストメソッドを作成するように努めています。これは、ドメインオブジェクトからビューモデルオブジェクトへのマッピングを目的としているため、2つのクラス間には関係がありません。

例として、ドメインクラスFooとビューモデルクラスがある場合、それを期待するプロパティを持つものFooMapをテストしたいと思います。FooFooMap

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このテストの目的でのプロパティが与えられた場合、クラスFooBarプロパティと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);

また、その方法が可能な限り熟練しているとは思えません。クラスが別のクラスのプロパティのサブセットを持っていることを確認するための一般的なテストメソッドを作成するための最良のメカニズムは何ですか?

4

1 に答える 1

0

式が何を返すかはあまり気にしない (R の型として object を渡す) ため、ExpectedPropertiesExist メソッドからジェネリック型パラメーター R を削除するだけで済みます。

public static void ExpectedPropertiesExist<TSource, TDestination>(params
    Expression<Func<TDestination, object>>[] 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));
}

このようにして、目的の構文 (2 つのジェネリック型パラメーターのみ) でメソッドを呼び出すことができます。

于 2012-12-23T14:16:56.280 に答える