Как утверждать структурную эквивалентность объекта в C # (со строгим равенством типов) - PullRequest
0 голосов
/ 23 октября 2018

Как вы можете элегантно утверждать следующий вид эквивалентности между двумя объектами .NET (в идеале, используя библиотеку Fluent Assertions)?

Два объекта структурно эквивалентны if:

  • оба объекта имеют одинаковый (во время выполнения) тип, а
  • публичные свойства обоих объектов (рекурсивно) структурно эквивалентны .

Обратите внимание, что 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() }}

будут считатьсяэквивалентен BeEquivalentTo, даже если их типы, типы их свойств и подвойств не совпадают и, следовательно, не являются структурно эквивалентными по приведенному выше определению.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

0 голосов
/ 23 октября 2018

Я придумала это решение, но я бы надеялась, что оно будет более элегантным.

Определите пользовательское 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()));
...