1

我正在努力编写一个测试方法来确定一个类是否具有不同类的属性的超集。这是为了从域对象映射到视图模型对象,因此这两个类之间没有关系。

例如,如果我有域类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);

我也不确定该方法是否尽可能熟练。编写通用测试方法以确保类具有单独类的属性子集的最佳机制是什么?

4

1 回答 1

0

由于您并不真正关心表达式返回什么(您将 object 作为 R 的类型传递),您可以从 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));
}

这样,您可以使用所需的语法(只有两个泛型类型参数)调用该方法。

于 2012-12-23T14:16:56.280 回答