Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中声明结构对象等价性(具有严格的类型相等)_C#_Unit Testing_Fluent Assertions - Fatal编程技术网

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

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()

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

两个对象在结构上是等效的,如果:

两个对象的运行时类型相同,并且 这两个对象的公共属性在结构上是递归等价的。 请注意,subject.Should.beequivalentToExpection不起作用,因为BeEquivalentTo不检查类型是否相等。例如,如果我们有两个类A和B,每个类都有一个属性对象X{get;set;},那么这两个对象

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