忽略ShouldBeEquivalentTo中的内部属性
在做ShouldBeEquivalentTo时有没有办法忽略类的内部属性?
例如,在下面的类中,我想从对象图比较中排除MetaData属性。
public class SomeObject { Public string SomeString { get; set; } internal MetaData MetaData { get; set; } }
我宁愿不使用
someObject.ShouldBeEquivalentTo(someOtherObject, options => options.Excluding(info => info.SelectedMemberPath == "MetaData")
因为我可能有超过1个内部属性,并为所有这些属性设置这将是乏味的。
FluentAssertions库中有IMemberSelectionRule
接口:
表示一个规则,用于定义要比较两个对象的结构相等性时要包括的主体成员。
实现此接口允许一次排除所有内部属性(其中IsAssembly
属性为true
):
internal class AllExceptNonPublicPropertiesSelectionRule : IMemberSelectionRule { public bool IncludesMembers { get { return false; } } public IEnumerable SelectMembers( IEnumerable selectedMembers, ISubjectInfo context, IEquivalencyAssertionOptions config) { return selectedMembers.Except( config.GetSubjectType(context) .GetNonPrivateProperties() .Where(p => p.GetMethod.IsAssembly) .Select(SelectedMemberInfo.Create)); } }
现在规则可用于unit testing:
someObject.ShouldBeEquivalentTo(someOtherObject, options => options.Using( new AllExceptNonPublicPropertiesSelectionRule()));