【问题标题】:Ignore internal properties in ShouldBeEquivalentTo忽略 ShouldBeEquivalentTo 中的内部属性
【发布时间】:2017-06-05 16:35:09
【问题描述】:

有没有办法在做 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 个内部属性,并且为所有这些属性设置它会很乏味。

【问题讨论】:

    标签: c# tdd fluent-assertions object-graph


    【解决方案1】:

    FluentAssertions 库中有IMemberSelectionRule 接口:

    表示一个规则,该规则定义在比较两个对象的结构相等性时要包括哪些被测对象的成员。

    实现此接口允许一次排除所有 internal 属性(其中IsAssembly 属性为true):

      internal class AllExceptNonPublicPropertiesSelectionRule : IMemberSelectionRule
      {
        public bool IncludesMembers
        {
          get { return false; }
        }
    
        public IEnumerable<SelectedMemberInfo> SelectMembers(
          IEnumerable<SelectedMemberInfo> selectedMembers,
          ISubjectInfo context,
          IEquivalencyAssertionOptions config)
        {
          return selectedMembers.Except(
            config.GetSubjectType(context)
              .GetNonPrivateProperties()
              .Where(p => p.GetMethod.IsAssembly)
              .Select(SelectedMemberInfo.Create));
        }
      }
    

    现在可以在单元测试中使用该规则:

      someObject.ShouldBeEquivalentTo(someOtherObject, options => options.Using(
        new AllExceptNonPublicPropertiesSelectionRule()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多