Autofixture: Comparaison sémantique - Ressemblance de deux collections d'enfants

Créé le 21 juin 2017  ·  13Commentaires  ·  Source: AutoFixture/AutoFixture

Je suis sûr que cela a déjà été demandé, et j'ai cherché sur Google et trouvé des solutions complexes, mais voilà quand même. J'ai deux objets complexes exactement du même type et je veux les comparer ; Cependant, ils contiennent une collection d'éléments qui doivent également être comparés, mais je souhaite ignorer l'ordre. Est-ce possible avec SemanticComparison ? J'utilise actuellement un mécanisme de comparaison json, mais le déboguer lorsque la comparaison échoue est un cauchemar. Cela ressemblait à l'utilisation de la ressemblanceLa classe dès la sortie de la boîte allait résoudre ce problème, mais cela a fait chier les collections même si elles contenaient des articles identiques.

question

Commentaire le plus utile

Pour ces scénarios, j'ai utilisé les https://github.com/jmansar/SemanticComparisonExtensions avec un grand effet. Avec cela, je peux contrôler les ressemblances intérieures et modifier un peu les choses.

C'est également un excellent moyen de configurer rapidement des comparaisons imbriquées complexes.

Tous les 13 commentaires

Pouvez-vous nous montrer à quoi ressemble l'objet que vous essayez de comparer ?

De plus, avez-vous essayé d'utiliser le SemanticComparer<T> directement comme indiqué dans cet exemple ? C'est plus flexible que d'utiliser Likeness<TSource, TDestination> .

L'objet a cette structure :

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

Les deux propriétés sur lesquelles il a eu le hoquet étaient la collection TagDto et YouTubeVideoDto, idéalement, il les traverserait et continuerait à comparer aussi profondément qu'elles allaient. Sinon, je vais m'en tenir à mon comparateur JSON car cette façon de comparer va de toute façon me faire faire un tas de travail.

Je serais curieux de savoir comment ce comparateur JSON gère IEnumerable<TagDto> s'il s'agit d'une séquence infinie ?

Comment quelque chose gérerait-il une séquence infinie? Je ne dis certainement pas que c'est parfait, et je cherche évidemment une autre solution d'où la plongée dans SemanticComparison, mais si SC ne peut pas gérer cette situation, alors je ne vois tout simplement pas l'intérêt de l'utiliser. Je suppose qu'il existe un moyen de gérer cela, je n'ai tout simplement pas pu trouver une bonne solution sur les anciens interwebs.

Vous pouvez faire similaire à ce , en utilisant un DelegatingMemberComparer qui soit revient toujours True pour IEnumerable<TagDto> ou, mieux encore, compare IEnumerable<TagDto> de la manière que vous voulez .

(Voir la deuxième et la troisième instance DelegatingMemberComparer dans le lien ci-dessus.)

D'accord, merci sincèrement pour l'aide.

Donc, en substance, je dois toujours écrire un DelegatingMemberComparer personnalisé pour chaque type. Alors, l'avantage d'utiliser la bibliothèque est que dans un test qui échoue, elle me dit quelles propriétés sont différentes ?

Je dois encore écrire un DelegatingMemberComparer personnalisé pour chaque type

  • Un DelegatingMemberComparer pour tous les types, qui fait a.Equals(b) ou même utilise la ressemblance pour cela
  • Un DelegatingMemberComparer pour IEnumerable<TagDto> comme indiqué dans le lien ci -

dans un test qui échoue, il me dit quelles propriétés sont différentes

Non, c'est ce que fait Ressemblance...

La ressemblance utilise SemanticComparer<T> interne pour comparer des objets... Donc, si vous utilisez SemanticComparer<T> vous serez peut-être plus flexible, mais vous perdrez la fonction de rapport de la ressemblance.

Si vous avez besoin les choses de rapports, vous pourriez être en mesure de réaliser quelque chose de similaire à l' aide de Ressemblance With et EqualsWhen la syntaxe comme indiqué dans cet exemple.

Bon, maintenant je reviens à ma question d'origine, qu'est-ce que j'obtiens de cette bibliothèque si les éléments de rapport ne sont plus là (d'après ce que j'ai lu, la ressemblance va être dépréciée), et si j'écris un DelegatingMemberComparer qui fait un .Equals(b), il va faire une comparaison de référence ou je dois remplacer la méthode Equals de chaque objet. Est-ce correct?

Alors, quel est le gain par rapport à l'utilisation de xUnit Assert avec IEqualityComparers ?

Je voudrais juste ajouter que je pense qu'AutoFixture est incroyable, et j'ai pensé que SemanticComparer rendrait mes assertions aussi faciles que mes configurations.

Je vais essayer de fournir 3 exemples (Likeness, SemanticComparer, IEqualityComparer) pour votre SongDto afin que nous puissions continuer à discuter à partir de là.—Je suis submergé de travail en ce moment, cela peut donc me prendre un certain temps. ..

@moodmosaic Merci beaucoup !! Et si vous souhaitez m'orienter vers des articles qui expliquent le pourquoi de SemanticComparer, peut-être que cela me rendrait moins dense sur ce point.

Pour ces scénarios, j'ai utilisé les https://github.com/jmansar/SemanticComparisonExtensions avec un grand effet. Avec cela, je peux contrôler les ressemblances intérieures et modifier un peu les choses.

C'est également un excellent moyen de configurer rapidement des comparaisons imbriquées complexes.

@cvbarros Ces extensions ont fonctionné à merveille, clôturant ce problème !

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

zvirja picture zvirja  ·  13Commentaires

dklinger picture dklinger  ·  10Commentaires

bjorn-ali-goransson picture bjorn-ali-goransson  ·  21Commentaires

thiagomajesk picture thiagomajesk  ·  11Commentaires

zvirja picture zvirja  ·  15Commentaires