Autofixture: Semantischer Vergleich - Ähnlichkeit zweier untergeordneter Sammlungen

Erstellt am 21. Juni 2017  ·  13Kommentare  ·  Quelle: AutoFixture/AutoFixture

Ich bin mir sicher, dass dies schon einmal gefragt wurde, und ich habe das gegoogelt und einige komplexe Lösungen gefunden, aber hier geht es trotzdem. Ich habe zwei komplexe Objekte genau des gleichen Typs und möchte sie vergleichen; Sie enthalten jedoch eine Sammlung von Elementen, die ebenfalls verglichen werden müssen, aber ich möchte die Reihenfolge ignorieren. Ist das mit SemanticComparison möglich? Ich verwende derzeit einen Json-Vergleichsmechanismus, aber dies zu debuggen, wenn die Vergleiche fehlschlagen, ist ein Albtraum. Es sah so aus, als würde man das Bild verwendenKlasse direkt nach dem Auspacken würde dies beheben, aber es scheiße auf die Sammlungen, obwohl sie identische Artikel enthielten.

question

Hilfreichster Kommentar

Für diese Szenarien habe ich die https://github.com/jmansar/SemanticComparisonExtensions mit großer Wirkung verwendet. Damit kann ich die inneren Ähnlichkeiten kontrollieren und die Dinge ein wenig optimieren.

Eine hervorragende Möglichkeit, auch komplexe verschachtelte Vergleiche schnell einzurichten.

Alle 13 Kommentare

Können Sie uns zeigen, wie das zu vergleichende Objekt aussieht?

Haben Sie auch versucht, SemanticComparer<T> direkt zu verwenden, wie in diesem Beispiel gezeigt? Dies ist flexibler als die Verwendung von Likeness<TSource, TDestination> .

Das Objekt hat diese Struktur:

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

Die beiden Eigenschaften, bei denen es Schluckauf gab, waren die TagDto-Sammlung und das YouTubeVideoDto, idealerweise würde es diese durchqueren und so tief wie möglich vergleichen. Ansonsten bleibe ich bei meinem JSON-Vergleich, da ich durch diese Art des Vergleichens sowieso eine Menge Arbeit erledigen muss.

Ich würde gerne herausfinden, wie dieser JSON-Vergleich mit IEnumerable<TagDto> umgeht, wenn es sich um eine unendliche Sequenz handelt.

Wie würde etwas mit einer unendlichen Folge umgehen? Ich sage sicherlich nicht, dass es perfekt ist, und ich suche offensichtlich nach einer anderen Lösung, daher der Einstieg in SemanticComparison, aber wenn SC mit dieser Situation nicht umgehen kann, sehe ich einfach keinen Sinn darin, es zu verwenden. Ich gehe davon aus, dass es eine Möglichkeit gibt, damit umzugehen, ich konnte einfach keine gute Lösung in den alten Interwebs finden.

Sie können ähnlich vorgehen , indem Sie ein DelegatingMemberComparer , das entweder immer True für IEnumerable<TagDto> zurückgibt oder, noch besser, IEnumerable<TagDto> vergleicht, wie Sie es möchten .

(Siehe die zweite und dritte DelegatingMemberComparer Instanz im obigen Link.)

Okay, vielen Dank für die Hilfe.

Im Wesentlichen muss ich also immer noch einen benutzerdefinierten DelegatingMemberComparer für jeden Typ schreiben. Der Vorteil der Verwendung der Bibliothek besteht also darin, dass sie mir bei einem fehlgeschlagenen Test sagt, welche Eigenschaften sich unterscheiden?

Ich muss noch einen benutzerdefinierten DelegatingMemberComparer für jeden Typ schreiben

  • Ein DelegatingMemberComparer für alle Typen, was a.Gleich(b) tut oder sogar Ähnlichkeit dafür verwendet
  • Ein DelegatingMemberComparer für IEnumerable<TagDto> wie in diesem Link oben gezeigt

bei einem fehlgeschlagenen Test sagt es mir, welche Eigenschaften sich unterscheiden

Nein, das macht Likes...

Likeness verwendet SemanticComparer<T> intern, um Objekte zu vergleichen... Wenn Sie also SemanticComparer<T> Sie möglicherweise flexibler, verlieren aber die Berichtsfunktion von Likeness.

Wenn Sie die Bericht Sachen brauchen, könnten Sie in der Lage sein , etwas zu erreichen ähnliche Figur ist mit With und EqualsWhen Syntax wie in gezeigt diesem Beispiel.

Okay, jetzt bin ich wieder bei meiner ursprünglichen Frage, was bekomme ich von dieser Bibliothek, wenn das Berichtszeug nicht mehr vorhanden ist (von dem, was ich gelesen habe, wird Likeness veraltet sein) und wenn ein DelegatingMemberComparer geschrieben wird, der a .Equals(b), es wird ein Referenzvergleich durchgeführt oder ich muss die Equals-Methode jedes Objekts überschreiben. Ist das richtig?

Was ist also der Vorteil gegenüber der Verwendung von xUnit Assert mit IEqualityComparers?

Ich möchte nur hinzufügen, dass ich AutoFixture für erstaunlich halte, und ich dachte, SemanticComparer würde meine Behauptungen so einfach machen wie meine Setups.

Ich werde versuchen, 3 Beispiele (Likeness, SemanticComparer, IEqualityComparer) für Ihr SongDto bereitzustellen, damit wir von dort aus weiter diskutieren können.—Ich bin im Moment mit Arbeit überhäuft, daher kann es eine Weile dauern. ..

@moodmosaic Vielen Dank !! Und wenn Sie mich auf einige Artikel hinweisen möchten, die erklären, warum SemanticComparer ist, würde mich das vielleicht in diesem Punkt weniger verdichtet machen.

Für diese Szenarien habe ich die https://github.com/jmansar/SemanticComparisonExtensions mit großer Wirkung verwendet. Damit kann ich die inneren Ähnlichkeiten kontrollieren und die Dinge ein wenig optimieren.

Eine hervorragende Möglichkeit, auch komplexe verschachtelte Vergleiche schnell einzurichten.

@cvbarros Diese Erweiterungen haben wie ein Zauber funktioniert und dieses Problem geschlossen!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen