C# 如何在C中声明结构对象等价性(具有严格的类型相等)
理想情况下,如何使用Fluent断言库在两个.NET对象之间优雅地断言以下类型的等价性 两个对象在结构上是等效的,如果: 两个对象的运行时类型相同,并且 这两个对象的公共属性在结构上是递归等价的。 请注意,subject.Should.beequivalentToExpection不起作用,因为BeEquivalentTo不检查类型是否相等。例如,如果我们有两个类A和B,每个类都有一个属性对象X{get;set;},那么这两个对象C# 如何在C中声明结构对象等价性(具有严格的类型相等),c#,unit-testing,fluent-assertions,C#,Unit Testing,Fluent Assertions,理想情况下,如何使用Fluent断言库在两个.NET对象之间优雅地断言以下类型的等价性 两个对象在结构上是等效的,如果: 两个对象的运行时类型相同,并且 这两个对象的公共属性在结构上是递归等价的。 请注意,subject.Should.beequivalentToExpection不起作用,因为BeEquivalentTo不检查类型是否相等。例如,如果我们有两个类A和B,每个类都有一个属性对象X{get;set;},那么这两个对象 new A { X = new B { X = new A()
new A { X = new B { X = new A() }}
及
将被BeEquivalentTo视为等效,即使它们的类型及其属性和子属性的类型不匹配,因此根据上述定义在结构上并不等效。我提出了这个解决方案,但我希望有一个更优雅的解决方案 定义自定义IEEquivalencyStep: 然后检查等效性,如下所示:
subject.Should().BeEquivalentTo(expectation, options => options.Using(new StrictTypeEquivalence()));
subject.Should.beoftypeexpection.GetType.And.Should.beeEquivalentToExpection;
这不检查属性的类型相等性和属性的属性等,这是问题中所述的结构等价性递归定义所要求的。
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()));