Frage

Ich möchte in der Lage sein, die beiden folgenden Objekte für die Ähnlichkeit mit autofixture zu vergleichen. SemanticComparison:

public class Object1
{
  public int a;
}

public class Object2
{
  public int a;
  public int b;
}

Nun, wenn ich es so mache:

var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2);

Ich bekomme die folgende Ausnahme: "Die folgenden Mitglieder stimmten nicht überein: - b.

Ich fand heraus, dass ich das 'B' -Mitglied wie dieses weglassen kann:

var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2);

Ich stelle jedoch fest, dass dies ziemlich umständlich ist, denn wenn ich ein neues Mitglied zu Klassenobjekt2 hinzufüge, muss ich meine Unit -Tests (oder zumindest Unit -Testhelfer) korrigieren.

Gibt es eine Möglichkeit zu sagen: "Ich möchte für die Ähnlichkeit vergleichen, nur für die Teilmenge, die in beiden Objekten existiert"?

War es hilfreich?

Lösung

Es hört sich so an, als ob Sie zwei Objekte basierend auf dem vergleichen möchten Überschneidung ihrer Eigenschaften. Dies wird derzeit nicht von der Ähnlichkeitsklasse unterstützt. Die Argumentation ist Folgendes:

Derzeit ist der Zieltyp (im obigen Beispiel, das Object2 wäre) die entscheidende Vorlage, auf der die Übereinstimmung durchgeführt wird. Dies liefert ziemlich stark Aussage für eine Behauptung: Jedes öffentliche Eigentum oder jedes Bereich dieser Klasse muss übereinstimmen.

Eine Erklärung zur Übereinstimmung mit dem Schnittpunkt der Eigenschaften wäre jedoch sehr schwach Aussage, weil das Kreuzung könnte leer sein. Dies könnte dazu führen Falsche Negative.

Auch wenn Sie den roten/grün/refaktorischen Zyklus befolgen und einen Unit -Test bei einem solchen hypothetischen Schnittpunkt der Ähnlichkeit fehlgeschlagen haben, können nachfolgende Refactorings eine solche Behauptung in ein falsches Negativ verwandeln, da Sie die letzte Eigenschaft oder das letzte Feld entfernen Die beiden Objekte haben gemeinsam - und Sie werden es nie bemerken.

Autofixure ist jedoch Open Source und alles, also sind Sie herzlich eingeladen zu Schlagen Sie diese Funktion vor oder senden Sie eine Pull -Anfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top