2015-12-19 9 views
6

ich mit fließend Behauptungen in meinen Unit-Tests arbeite, aber die Verwendung von ShouldBeEquivalentTo, ShouldAllBeEquivalentTo und BeEquivalentTo ist unklar.Verwendung von `ShouldBeEquivalentTo`,` ShouldAllBeEquivalentTo` und `BeEquivalentTo`

Zum Beispiel; Alle folgenden Anweisungen bestehen, so dass die Funktionen äquivalent erscheinen.

List<string> a = new List<string>() { "james", "wood" }; 
List<string> b = new List<string>() { "james", "wood" }; 

a.ShouldBeEquivalentTo(b); 
a.ShouldAllBeEquivalentTo(b); 
a.Should().BeEquivalentTo(b); 

Warum sollte ich einen statt den anderen verwenden?

Antwort

6

ShouldBeEquivalentTo und ShouldAllBeEquivalentTo gleich sind und einen rekursiven strukturellen Vergleich zu tun. Da das Verhalten jedoch sehr konfigurierbar ist, unterstützen einige der Optionen die Verwendung von Eigenschaftsausdrücken zum Einschließen oder Ausschließen bestimmter Elemente. Der Ausdruck T im Ausdruck bezieht sich jedoch auf den Typ des Stammobjekts (List<string>), wenn ShouldBeEquivalentTo verwendet wird, und string, wenn ShouldAllBeEquivalentTo verwendet wird. Ersteres wirkt auf das gesamte Objekt, letzteres wirkt auf IEnumerable<T>.

Should().BeEquivalentTo() ist eine viel einfachere Implementierung, die nur einen Auftrag-unempfindlichen Vergleich unter Verwendung Equals machen wird. Diese Methode wird in der nächsten brechenden Änderung (v5.x) entfernt.

-2

Als Konzept wird eine Liste als eine einzelne Einheit betrachtet. Aus Sicht der Lesbarkeit ist also der einzelne gültige Aufruf "a.ShouldBeEquivalentTo (b);" aus einer Ihrer Optionen wählbar.

In Bezug auf andere sind sie obskur.

Die Pluralform "ShouldAllBeEquivalentTo" wird angewendet, wenn 2 Sammlungen von Elementen verglichen werden. Ich denke, man würde argumentieren, dass wir diese Gruppe von Saiten (A) mit diesen Saitengruppen (B) vergleichen. Was hier passiert ist, die Gruppe der Strings wurde als ganzes einzelnes Konzept unter einem Listen-Datenstrukturtyp gesammelt. Daher würde ich sagen, dass es falsch ist, diesen Anruf zu verwenden.

Die letzte Form impliziert 2 Dinge. Zuerst sollte das Objekt "a" in etwas umgewandelt werden. Der Name "Should" teilt nichts mit. Danach sollte das Ergebnis verglichen werden, wenn es einem Listenobjekt "b" entspricht. Logischerweise sollte man 2 Objekte desselben Typs vergleichen. Eine zusätzliche Transformation ist nicht notwendig.

Wenn Code liest, würde ich das folgende Format bevorzugen:

Eine Liste "A" ist mit einer anderen Liste "B" gleichwertig.

List<string> a = new List<string>() { "james", "wood" }; 
List<string> b = new List<string>() { "james", "wood" }; 

//creating "IsEquivalentTo" method 
bool listsAreEqual = a.IsEquivalentTo(b); 

//creating "IsEqualTo" method 
listsAreEqual = a.IsEqualTo(b); 

//overloading operator == 
listsAreEqual = (a == b); 
+1

Ich bin verwirrt von Ihrer Antwort, die Funktionen, die ich gefragt habe, sind Funktionen von Third Party Assertion Frame Arbeit Fluent Assertions (https://github.com/dennisdoomen/fluentassertions). –