Autofixture: Семантическое сравнение - подобие двух дочерних коллекций

Созданный на 21 июн. 2017  ·  13Комментарии  ·  Источник: AutoFixture/AutoFixture

Я уверен, что об этом уже спрашивали раньше, я погуглил и нашел несколько сложных решений, но здесь все равно. У меня есть два сложных объекта одного и того же типа, и я хочу их сравнить; однако они содержат набор элементов, которые также необходимо сравнивать, но я хочу проигнорировать порядок. Возможно ли это с помощью семантического сравнения? В настоящее время я использую механизм сравнения json, но отлаживать его при сбое сравнения - кошмар. Похоже, с помощью подобияclass прямо из коробки собирался исправить это, но он не справился с коллекциями, хотя они содержали идентичные элементы.

question

Самый полезный комментарий

Для этих сценариев я с большим эффектом использовал https://github.com/jmansar/SemanticComparisonExtensions . Благодаря этому я могу контролировать внутреннее сходство и немного подправлять вещи.

Также является отличным способом быстрой настройки сложных вложенных сравнений.

Все 13 Комментарий

Вы можете показать нам, как выглядит объект, который вы пытаетесь сравнить?

Кроме того, пробовали ли вы использовать SemanticComparer<T> напрямую, как показано в этом примере? Это более гибко, чем использование Likeness<TSource, TDestination> .

Объект имеет такую ​​структуру:

public class SongDto
    {
        public string Lyrics { get; set; }
        public IEnumerable<TagDto> Tags { get; set; }
        public string FileName { get; set; }
        public string CustomPromoLink { get; set; }
        public string UPC { get; set; }
        public YoutubeVideoDto YouTubeVideo { get; set; }
    }

Два свойства, с которыми он столкнулся, - это коллекция TagDto и YouTubeVideoDto, в идеале он будет проходить через них и сравнивать их по мере их углубления. В противном случае я собираюсь придерживаться своего компаратора JSON, так как этот способ сравнения в любом случае заставит меня проделать кучу работы.

Мне было бы любопытно узнать, как этот компаратор JSON обрабатывает IEnumerable<TagDto> если это бесконечная последовательность?

Как что-нибудь обработает бесконечную последовательность? Я, конечно, не говорю, что это идеально, и я, очевидно, ищу другое решение, поэтому углубляюсь в SemanticComparison, но если SC не может справиться с этой ситуацией, я просто не вижу смысла в его использовании. Я предполагаю, что есть способ справиться с этим, я просто не мог найти хорошее решение в старых сетях.

Вы можете сделать то же с этим , с помощью DelegatingMemberComparer , что либо возвращается всегда True за IEnumerable<TagDto> или, еще лучше, сравнивает IEnumerable<TagDto> , как вы хотите .

(См. Второй и третий экземпляры DelegatingMemberComparer в приведенной выше ссылке.)

Хорошо, искренне благодарю за помощь.

По сути, мне все еще нужно написать собственный DelegatingMemberComparer для каждого типа. Итак, преимущество использования библиотеки в том, что в неудачном тесте она сообщает мне, какие свойства отличаются?

Мне все еще нужно написать собственный DelegatingMemberComparer для каждого типа

  • Один DelegatingMemberComparer для всех типов, который выполняет a.Equals (b) или даже использует для этого Likeness
  • Один DelegatingMemberComparer за IEnumerable<TagDto> как показано в этой ссылке выше

в неудачном тесте он сообщает мне, какие свойства отличаются

Нет, это то, что делает Сходство ...

Likeness использует SemanticComparer<T> внутреннего сравнения объектов ... Итак, если вы собираетесь использовать SemanticComparer<T> вы можете быть более гибкими, но потеряете функцию отчетов Likeness.

Если вам действительно нужны отчеты, вы можете добиться чего-то подобного, используя синтаксис Likeness With и EqualsWhen как показано в этом примере.

Хорошо, теперь я возвращаюсь к своему первоначальному вопросу, что я могу получить от этой библиотеки, если материала для отчетов больше нет (из того, что я прочитал, Likeness будет устаревшим), и если написать DelegatingMemberComparer, который выполняет .Equals (b), он будет выполнять сравнение ссылок, или мне придется переопределить метод Equals каждого объекта. Это правильно?

Итак, в чем преимущество использования xUnit Assert с IEqualityComparers?

Я просто хотел бы добавить, что я думаю, что AutoFixture великолепен, и я полагал, что SemanticComparer сделает мои утверждения такими же простыми, как и мои настройки.

Я постараюсь предоставить 3 примера (Likeness, SemanticComparer, IEqualityComparer) для вашего SongDto чтобы мы могли продолжить обсуждение оттуда. - Сейчас я загружен работой, так что это может занять у меня некоторое время. ..

@moodmosaic Большое спасибо !! И если вы хотите указать мне на несколько статей, которые объясняют, что такое SemanticComparer, возможно, это сделало бы меня менее сдержанным в этом вопросе.

Для этих сценариев я с большим эффектом использовал https://github.com/jmansar/SemanticComparisonExtensions . Благодаря этому я могу контролировать внутреннее сходство и немного подправлять вещи.

Также является отличным способом быстрой настройки сложных вложенных сравнений.

@cvbarros Эти расширения работали как шарм,

Была ли эта страница полезной?
0 / 5 - 0 рейтинги