Autofixture: Comparação semântica - semelhança de duas coleções filho

Criado em 21 jun. 2017  ·  13Comentários  ·  Fonte: AutoFixture/AutoFixture

Tenho certeza que isso já foi perguntado antes, e eu pesquisei isso no Google e encontrei algumas soluções complexas, mas aqui vai mesmo assim. Tenho dois objetos complexos exatamente do mesmo tipo e quero compará-los; no entanto, eles contêm uma coleção de itens que também precisam ser comparados, mas desejo ignorar a ordem. Isso é possível com o SemanticComparison? No momento, estou usando um mecanismo de comparação json, mas depurar isso quando a comparação falha é um pesadelo. Parecia usar o Likenessuma classe pronta para usar iria consertar isso, mas acabou nas coleções, embora contivessem itens idênticos.

question

Comentários muito úteis

Para esses cenários, usei https://github.com/jmansar/SemanticComparisonExtensions com grande efeito. Com isso, posso controlar as semelhanças internas e ajustar um pouco as coisas.

Também é uma maneira excelente de configurar rapidamente comparações aninhadas complexas.

Todos 13 comentários

Você pode nos mostrar como é o objeto que você está tentando comparar?

Além disso, você já tentou usar SemanticComparer<T> diretamente, conforme mostrado neste exemplo? Isso é mais flexível do que usar Likeness<TSource, TDestination> .

O objeto tem esta estrutura:

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; }
    }

As duas propriedades em que ele soltou foram a coleção TagDto e YouTubeVideoDto, o ideal é que ele as atravessasse e continuasse comparando o quanto elas fossem. Caso contrário, vou ficar com o meu comparador JSON, pois essa forma de comparação vai me fazer fazer um monte de trabalho de qualquer maneira.

Eu ficaria curioso para descobrir como esse comparador JSON lida com IEnumerable<TagDto> se for uma sequência infinita.

Como qualquer coisa lidaria com uma sequência infinita? Certamente não estou dizendo que é perfeito, e obviamente estou procurando outra solução por isso mergulhar na comparação semântica, mas se o SC não puder lidar com essa situação, então simplesmente não vejo sentido em usá-lo. Presumo que haja uma maneira de lidar com isso, mas não consegui encontrar uma boa solução nas velhas redes.

Você pode fazer algo semelhante a isso , usando um DelegatingMemberComparer que retorna sempre True para IEnumerable<TagDto> ou, ainda melhor, compara IEnumerable<TagDto> da maneira que você quiser .

(Veja a segunda e a terceira instância de DelegatingMemberComparer no link acima.)

Ok, obrigado sinceramente pela ajuda.

Portanto, em essência, ainda preciso escrever um DelegatingMemberComparer personalizado para cada tipo. Portanto, a vantagem de usar a biblioteca é que, em um teste com falha, ela me diz quais propriedades são diferentes?

Ainda tenho que escrever um DelegatingMemberComparer personalizado para cada tipo

  • Um DelegatingMemberComparer para todos os tipos, o que faz a.Equals (b) ou mesmo usa Likeness para isso
  • Um DelegatingMemberComparer para IEnumerable<TagDto> conforme mostrado no link acima

em um teste com falha, ele me diz quais propriedades são diferentes

Não, é isso que o Likeness faz ...

Likeness usa SemanticComparer<T> internamente para comparar objetos ... Então, se você for usar SemanticComparer<T> você pode ser mais flexível, mas perderá o recurso de relatório de Likeness.

Se você precisa fazer as coisas de relatórios, você pode ser capaz de conseguir algo semelhante, usando de Semelhança With e EqualsWhen sintaxe como mostrado no presente exemplo.

Ok, agora estou de volta à minha pergunta original, o que eu obtenho desta biblioteca se o material de relatório não estiver mais lá (pelo que li, Likeness será descontinuado), e se escrever um DelegatingMemberComparer que faça um .Equals (b), ele vai fazer uma comparação de referência ou eu tenho que substituir o método Equals de cada objeto. Isso está certo?

Qual é a vantagem de usar o xUnit Assert com IEqualityComparers?

Gostaria apenas de acrescentar que acho o AutoFixture incrível e achei que o SemanticComparer tornaria minhas afirmações tão fáceis quanto minhas configurações.

Tentarei fornecer 3 exemplos (Likeness, SemanticComparer, IEqualityComparer) para o seu SongDto para que possamos continuar discutindo a partir daí. - Estou sobrecarregado de trabalho no momento, então pode demorar um pouco. ..

@moodmosaic Muito obrigado !! E se você gostaria de me indicar alguns artigos que explicam os porquês e o que é o SemanticComparer, talvez isso me tornasse menos denso neste ponto.

Para esses cenários, usei https://github.com/jmansar/SemanticComparisonExtensions com grande efeito. Com isso, posso controlar as semelhanças internas e ajustar um pouco as coisas.

Também é uma maneira excelente de configurar rapidamente comparações aninhadas complexas.

@cvbarros Essas extensões funcionaram

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Ridermansb picture Ridermansb  ·  4Comentários

zvirja picture zvirja  ·  3Comentários

ecampidoglio picture ecampidoglio  ·  7Comentários

zvirja picture zvirja  ·  4Comentários

ploeh picture ploeh  ·  3Comentários