代码之家  ›  专栏  ›  技术社区  ›  Mo B.

如何在C#(具有严格类型相等性)中断言结构对象等价性

  •  0
  • Mo B.  · 技术社区  · 6 年前

    如何优雅地断言两个.NET对象之间的以下等价性(理想情况下使用Fluent断言库)?

    两个对象是 结构等效 如果:

    • 两个对象都是相同的(运行时)类型,并且
    • 两个对象的公共属性都是(递归的) 结构等效

    请注意 subject.Should().BeEquivalentTo(expectation) 从那以后就不起作用了 BeEquivalentTo 不检查类型相等性。例如,如果我们有两个班 A B 每个都有一个属性 object X { get; set; }

    new A { X = new B { X = new A() }}
    

    new B { X = new A { X = new B() }}
    

    将被视为等同于 蜂胶 ,即使它们的类型与其属性和子属性的类型不匹配,因此根据上述定义在结构上并不等价。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Mo B.    6 年前

    我提出了这个解决方案,但我希望有一个更优雅的解决方案。

    IEquivalencyStep :

        public class StrictTypeEquivalence : IEquivalencyStep
        {          
            public bool CanHandle(IEquivalencyValidationContext context, IEquivalencyAssertionOptions config)
            {
                return context.Subject != null && context.Expectation != null &&
                       context.Subject.GetType() != context.Expectation.GetType();
            }
    
            public bool Handle(IEquivalencyValidationContext context, IEquivalencyValidator parent, IEquivalencyAssertionOptions config)
            {
                throw new AssertionFailedException($"{context.SelectedMemberPath}: Expected type {context.Expectation.GetType()} but found {context.Subject.GetType()} instead.");
            }
        }
    

    然后像这样检查等价性:

    subject.Should().BeEquivalentTo(expectation, options => options.Using(new StrictTypeEquivalence()));
    
        2
  •  -1
  •   Dennis Doomen    6 年前

    subject.Should().BeOfType(expectation.GetType).And.Should().BeEquivalentTo(expectation);