Angenommen, ich habe Folgendes:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Beide oben genannten Tests bestehen. Gibt es einen Unterschied zwischen toBe()
und toEqual()
bei der Bewertung von Zahlen? Wenn ja, wann sollte ich das eine und nicht das andere verwenden?
javascript
jasmine
Lloyd Banks
quelle
quelle
toEqual()
wird nach Schlüssel / Wert-Inhalt verglichen;toBe()
wird anhand der Objektreferenz verglichen.Antworten:
Für primitive Typen (z. B. Zahlen, Boolesche Werte, Zeichenfolgen usw.) gibt es keinen Unterschied zwischen
toBe
undtoEqual
; entweder arbeiten für5
,true
oder"the cake is a lie"
.Um den Unterschied zwischen
toBe
und zu verstehentoEqual
, stellen wir uns drei Objekte vor.Bei einem strengen Vergleich (
===
) sind einige Dinge "gleich":Aber einige Dinge sind, obwohl sie "gleich" sind, nicht "gleich", da sie Objekte darstellen, die an verschiedenen Orten im Gedächtnis leben.
Jasmines
toBe
Matcher ist nichts anderes als ein Wrapper für einen strengen Gleichheitsvergleichist das gleiche wie
Nimm nicht einfach mein Wort dafür; Siehe den Quellcode für toBe .
Aber
b
undc
repräsentieren funktional äquivalente Objekte; sie sehen beide so ausWäre es nicht großartig, wenn wir das sagen könnten
b
undc
"gleich" sind, auch wenn sie nicht dasselbe Objekt darstellen?Geben Sie ein
toEqual
, wodurch "tiefe Gleichheit" überprüft wird (dh eine rekursive Suche durch die Objekte durchgeführt wird, um festzustellen, ob die Werte für ihre Schlüssel äquivalent sind). Beide folgenden Tests bestehen:Hoffe, das hilft, einige Dinge zu klären.
quelle
expect(0).toBe(-0)
wird bestehen, aberexpect(0).toEqual(-0)
scheitern.toBe
verwendet strikte Gleichheit - vergleicht anhand von Referenzen,toEqual
verwendet Eigenschaftsäquivalenz. EmpfohlentoEqual
für PrimitivetoEqual
ist viel vorsichtiger über Gleichheit (0 != -0
,"hi" = new String("hi")
usw.), so dass ich mit empfehlen würdetoEqual
ausschließlich es sei denn , Sie sind besorgt tatsächlich über Referenz Gleichwertigkeit. Alle ÜberprüfungentoEqual
dereq
Methode finden Sie hier: github.com/jasmine/jasmine/blob/master/src/core/matchers/…toBe()
versustoEqual()
:toEqual()
prüft die Äquivalenz.toBe()
stellt andererseits sicher, dass es sich um genau dasselbe Objekt handelt.Ich würde sagen, verwenden Sie
toBe()
beim Vergleichen von Werten undtoEqual()
beim Vergleichen von Objekten.Beim Vergleich von primitiven Typen,
toEqual()
undtoBe()
das gleiche Ergebnis ergibt. Beim Vergleichen von ObjektentoBe()
handelt es sich um einen strengeren Vergleich. Wenn es sich nicht um genau dasselbe Objekt im Speicher handelt, wird false zurückgegeben. Wenn Sie also nicht sicherstellen möchten, dass es sich um genau dasselbe Objekt im Speicher handelt, verwenden Sie estoEqual()
zum Vergleichen von Objekten.Weitere Informationen finden Sie unter diesem Link: http://evanhahn.com/how-do-i-jasmine/
Wenn Sie nun den Unterschied zwischen
toBe()
undtoEqual()
in Bezug auf Zahlen betrachten, sollte es keinen Unterschied geben, solange Ihr Vergleich korrekt ist.5
wird immer gleich sein5
.Ein schöner Ort, um damit herumzuspielen und verschiedene Ergebnisse zu sehen, ist hier
Aktualisieren
Eine einfache Möglichkeit zu betrachten
toBe()
undtoEqual()
zu verstehen ist, was genau sie in JavaScript tun. Laut Jasmine API hier zu finden :Im Wesentlichen , was das sagt , ist ,
toEqual()
undtoBe()
sind ähnlich Javascripts===
Betreiber außertoBe()
auch sicherstellen, ist die Überprüfung ist es genau das gleiche Objekt, dass für das Beispiel untenobjectOne === objectTwo //returns false
als auch. IntoEqual()
dieser Situation wird jedoch true zurückgegeben.Jetzt können Sie zumindest verstehen, warum, wenn gegeben:
expect(objectOne).toBe(objectTwo); //returns false
Dies liegt daran,
===
dass der Operator , wie in dieser Antwort auf eine andere, aber ähnliche Frage angegeben, tatsächlich bedeutet, dass beide Operanden auf dasselbe Objekt verweisen oder bei Werttypen denselben Wert haben.quelle
toEqual()
bedeutet, indem Sie sagen, dass dietoEqual()
Äquivalenz überprüft wird , aber die naheliegende nächste Frage ist in Ordnung. Was bedeutet also "Äquivalent"? Eine Beschreibung des Algorithmus zur Bestimmung der "Äquivalenz" oder zumindest Beispiele für Fälle, in denen sich das Verhalten vontoEqual()
und das VerhaltentoBe()
unterscheiden, würde dies nützlicher machen.toEqual
sollte für einen tiefen Vergleich zwischen Objekten verwendet werden, nichttoBe
. jsfiddle.net/bBL9P/67toEqual
ist überhaupt nicht das gleiche wie==
.expect(1).toEqual('1')
schlägt fehl, solange1 == '1'
es wahr ist.toEqual
hat nichts damit zu tun==
. Es ist so===
, als würde es Objekte auf ähnliche Weise wie beim Vergleich nach Werten vergleichen.Um das Jasmin-Github-Projekt zu zitieren:
quelle
Ein Blick auf den Jasmine-Quellcode wirft mehr Licht auf das Problem.
toBe
ist sehr einfach und verwendet nur den Identitäts- / strengen Gleichheitsoperator===
:toEqual
, Auf der anderen Seite, ist fast 150 Zeilen lang und hat eine spezielle Behandlung in Objekten wie gebaut fürString
,Number
,Boolean
,Date
,Error
,Element
undRegExp
. Für andere Objekte werden Eigenschaften rekursiv verglichen.Dies unterscheidet sich stark vom Verhalten des Gleichheitsoperators
==
. Zum Beispiel:quelle
toEqual()
vergleicht Werte, wenn primitiv, oder Inhalt, wenn Objekte.toBe()
vergleicht Referenzen.Der folgende Code / die folgende Suite sollte selbsterklärend sein:
quelle
Dachte, jemand könnte eine Erklärung anhand eines (kommentierten) Beispiels mögen:
Wenn meine deepClone () -Funktion ihre Aufgabe richtig erledigt, ist der Test (wie im Aufruf 'it ()' beschrieben) erfolgreich:
Dies ist natürlich keine vollständige Testsuite für mein deepClone (), da ich hier nicht getestet habe, ob das Objektliteral im Array (und das darin verschachtelte) ebenfalls eine eindeutige Identität, aber dieselben Werte aufweist.
quelle
Ich denke, toEqual prüft tief gleich, toBe ist die gleiche Referenz von 2 Variablen
quelle
Zu beachtende Punkte:
toBe()
behandelt Vergleiche wieObject.is()
.toEqual()
behandelt Vergleiche wie===
.Aus diesem Grunde für primitive Typen,
toBe
undtoEqual
haben nicht viel Unterschied , wenn für die Gleichstellung Prüfung, sondern auch für Referenztypen wie Objekte, die Sie lieber verwendentoEqual
für Gleichheit zu testen.quelle