忽略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()));