我正在努力编写一个测试方法来确定一个类是否具有不同类的属性的超集。这是为了从域对象映射到视图模型对象,因此这两个类之间没有关系。
例如,如果我有域类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);
我也不确定该方法是否尽可能熟练。编写通用测试方法以确保类具有单独类的属性子集的最佳机制是什么?