Was ist der Unterschied zwischen expect(something).toBe(true)
, expect(something).toBeTruthy()
und expect(something).toBeTrue()
?
Beachten Sie, dass dies toBeTrue()
ein benutzerdefinierter Matcher ist , der jasmine-matchers
unter anderen nützlichen und praktischen Matchern wie toHaveMethod()
oder eingeführt wurde toBeArrayOfStrings()
.
Die Frage soll allgemein gehalten sein, aber als Beispiel aus der Praxis teste ich, ob ein Element in angezeigt wird protractor
. Welchen Matcher soll ich in diesem Fall verwenden?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
.toBe(true)
==.toBeTrue()
. toBeTruthy () kann nicht nur wahr sein , sondern auch 123 , "dfgdfg", [1,2,3] usw. sind im Grundeif(x==true)
wahr, währendif(x===true)
wahr wahr sind.toBeTruthy
Sie diese Option, wenn Sie sich nicht sicher sind, welcher Typ derselbe ist,== true
obwohl ich vermute, dass er.toBe(true)
derselbe ist wie=== true
Mind you. Es ist ein wenig übertrieben, eine Funktion aufzurufen, um auf true zu testen. Ein Rat,. Vergiss==
und!=
existiert in Javascript und benutze es nie wieder. Wahrheit ist nicht nötig und eine Falle für Anfänger. Verwenden Sie===
und!==
stattdessen.eslint
uns sogar gemeldet, ob==
oder!=
werden vorgeschlagen, dies in===
und zu ändern!==
.Antworten:
Was ich mache, wenn ich mich so etwas wie die hier gestellte Frage frage, ist, zur Quelle zu gehen.
sein()
expect().toBe()
ist definiert als:Es führt seinen Test durch,
===
was bedeutet, dass es bei Verwendung alsexpect(foo).toBe(true)
nur bestanden wird, wenn esfoo
tatsächlich den Wert hattrue
. Wahrheitswerte bestehen den Test nicht.toBeTruthy ()
expect().toBeTruthy()
ist definiert als:Typ Zwang
Ein Wert ist wahr, wenn der Zwang dieses Wertes zu einem Booleschen Wert den Wert ergibt
true
. Die Operation!!
prüft die Richtigkeit, indem derexpect
an einen Booleschen Wert übergebene Wert erzwungen wird . Beachten Sie, dass im Gegensatz zu dem, was die derzeit akzeptierte Antwort impliziert ,== true
ist nicht für Truthiness eine richtige Prüfung. Sie werden lustige Dinge wie bekommenBei Verwendung von
!!
Erträgen:(Ja, leer oder nicht, ein Array ist wahr.)
toBeTrue ()
expect().toBeTrue()
ist Teil von Jasmine-Matchers (das auf npm registriert ist, wiejasmine-expect
nach einem späteren Projekt, dasjasmine-matchers
zuerst registriert wurde ).expect().toBeTrue()
ist definiert als:Der Unterschied zu
expect().toBeTrue()
undexpect().toBe(true)
besteht darin, dassexpect().toBeTrue()
geprüft wird, ob es sich um einBoolean
Objekt handelt.expect(new Boolean(true)).toBe(true)
würde scheitern, währendexpect(new Boolean(true)).toBeTrue()
passieren würde. Das liegt an dieser lustigen Sache:Zumindest ist es wahr:
Welches ist am besten für die Verwendung geeignet
elem.isDisplayed()
?Letztendlich übergibt der Winkelmesser diese Anfrage an Selen. Die Dokumentation besagt, dass der von erzeugte Wert
.isDisplayed()
ein Versprechen ist, das sich in a auflöstboolean
. Ich würde es zum Nennwert nehmen und.toBeTrue()
oder verwenden.toBe(true)
. Wenn ich einen Fall finden würde, in dem die Implementierung Wahrheits- / Falschwerte zurückgibt, würde ich einen Fehlerbericht einreichen.quelle
In Javascript gibt es Wahrheiten und Wahrheiten. Wenn etwas wahr ist, ist es offensichtlich wahr oder falsch. Wenn etwas wahr ist, kann es ein Boolescher Wert sein oder auch nicht, aber der "Cast" -Wert von ist ein Boolescher Wert.
Beispiele.
Dies kann die Arbeit vereinfachen, wenn Sie überprüfen möchten, ob eine Zeichenfolge festgelegt ist oder ein Array Werte enthält.
Und wie gesagt.
expect(something).toBe(true)
undexpect(something).toBeTrue()
ist das gleiche. Istexpect(something).toBeTruthy()
aber nicht dasselbe wie beides.quelle
[] == false;
ist nicht richtig, die Aussage selbst ist falsch, weil Objekte immer wahr sind[] == false;
isttrue
[""]==false
oder[0]== false
; nicht leer, nicht falsey, nur trügerisch ...x == true
wie in Ihren Beispielen ist eine irreführende und, wie die obigen Kommentare zeigen, falsche Darstellung des Konzepts der Wahrhaftigkeit in JavaScript. Der eigentliche Test der Wahrhaftigkeit in JavaScript besteht darin, wie sich ein Wert in einerif
Anweisung oder als Operand in einem booleschen Ausdruck verhält . Wir wissen, dass dies1
wahr ist, daif (1)
dadurch die nächste Aussage bewertet wird. Ebenso[]
ist es aus dem gleichen Grund wahr: Auch wenn es sich um eine[] == true
Bewertung handeltfalse
,if ([])
wird die nächste Aussage dennoch bewertet, sodass wir wissen, dass sie[]
wahr ist.Ich weiß, dass jeder eine einfach zu lesende Liste liebt:
toBe(<value>)
- Der zurückgegebene Wert ist der gleiche wie<value>
toBeTrue()
- Überprüft, ob der zurückgegebene Wert isttrue
toBeTruthy()
- Überprüfen Sie, ob der Wert, wenn er in einen Booleschen Wert umgewandelt wird, ein wahrer Wert istTruthy Werte sind alle Werte, die nicht
0
,''
(leere Zeichenkette),false
,null
,NaN
,undefined
oder[]
(Leer - Array) *.* Beachten Sie
!![]
, dass beim Ausführen zurückgegeben wirdtrue
, beim Ausführen[] == false
jedoch auchtrue
. Es hängt davon ab, wie es implementiert wird. Mit anderen Worten:(!![]) === ([] == false)
In Ihrem Beispiel
toBe(true)
undtoBeTrue()
wird die gleichen Ergebnisse liefern.quelle
alert(!![])
[] == true
in Ihrer Konsole erzeugtfalse
.[] == false
in Ihrer Konsole produzierttrue
Es gibt viele gute Antworten, ich wollte nur ein Szenario hinzufügen, in dem die Verwendung dieser Erwartungen hilfreich sein könnte. Mit
element.all(xxx)
, wenn ich überprüfen muss, ob alle Elemente in einem einzigen Lauf angezeigt werden, kann ich ausführen -Grund dafür
.all()
gibt ein Array von Werten und so alle Arten von Erwartungen (getText
,isPresent
, etc ...) kann mit durchgeführt werden ,toBeTruthy()
wenn.all()
kommt ins Bild. Hoffe das hilft.quelle
reduce()
das Array von Booleschen Werten in einen einzigen Wert umgewandelt und dann dietoBe(true)
Prüfung angewendet habe . Das ist viel einfacher, danke.