Jaka jest różnica między expect(something).toBe(true)
, expect(something).toBeTruthy()
i expect(something).toBeTrue()
?
Zauważ, że toBeTrue()
jest to niestandardowy element dopasowujący wprowadzony jasmine-matchers
wśród innych przydatnych i przydatnych dopasowań, takich jak toHaveMethod()
lub toBeArrayOfStrings()
.
Pytanie ma być ogólne, ale jako przykład ze świata rzeczywistego testuję, czy element jest wyświetlany protractor
. Którego dopasowania powinienem użyć w tym przypadku?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
.toBe(true)
==.toBeTrue()
. toBeTruthy () może być prawdziwe nie tylko na podstawie true , ale także na 123 , "dfgdfg", [1, 2, 3], itd ... w zasadzieif(x==true)
są prawdziwe, podczas gdyif(x===true)
są prawdziwe.toBeTruthy
jeśli nie jesteś pewien typu, jest on taki sam, jak== true
podczas gdy podejrzewam, że.toBe(true)
jest taki sam, jak=== true
Pamiętaj, że to trochę za burtą, aby wywołać funkcję, aby sprawdzić, czy jest prawda. Słowo porady. Zapomnij==
i!=
istnieje w Javascript i nigdy nie używaj go ponownie. Prawda nie jest potrzebna i jest pułapką dla początkujących. Użyj===
i!==
zamiast tego.eslint
zgłoszenie do nas, jeśli==
lub!=
są wykorzystywane sugeruje, aby zmienić===
i!==
.Odpowiedzi:
To, co robię, gdy zastanawiam się, jak zadane tutaj pytanie, to skierowanie się do źródła.
być()
expect().toBe()
definiuje się jako:Wykonuje swój test,
===
co oznacza, że gdy jest używany jakoexpect(foo).toBe(true)
, przejdzie tylko wtedy, gdyfoo
faktycznie ma wartośćtrue
. Prawdziwe wartości nie przejdą testu.toBeTruthy ()
expect().toBeTruthy()
definiuje się jako:Wymuszenie typu
Wartość jest prawdziwa, jeśli wymuszenie tej wartości na wartość logiczną daje wartość
true
. Operacja!!
sprawdza prawdziwość przez wymuszenie wartości przekazanej do wartościexpect
logicznej. Zauważ, że wbrew temu, co sugeruje obecnie przyjęta odpowiedź , nie== true
jest to poprawny test na prawdziwość. Dostaniesz zabawne rzeczy, takie jakNatomiast używając
!!
plonów:(Tak, pusta czy nie, tablica jest prawdziwa).
szczerze mówiąc()
expect().toBeTrue()
jest częścią Jasmine-Matchers (który jest zarejestrowany na npm jakjasmine-expect
późniejszy projekt zarejestrowany jakojasmine-matchers
pierwszy).expect().toBeTrue()
definiuje się jako:Różnica między
expect().toBeTrue()
iexpect().toBe(true)
polega na tym, żeexpect().toBeTrue()
testuje, czy ma do czynienia zBoolean
obiektem.expect(new Boolean(true)).toBe(true)
zawiedzie, podczas gdyexpect(new Boolean(true)).toBeTrue()
przejdzie. To z powodu tej zabawnej rzeczy:Przynajmniej jest to prawda:
Który najlepiej nadaje się do użytku z
elem.isDisplayed()
?Ostatecznie Protractor przekazuje tę prośbę Selenium. Dokumentacja wskazuje, że wartość wytworzona przez
.isDisplayed()
to obietnica, że rozpoznawany jakoboolean
. Wziąłbym to za wartość nominalną i użyłbym.toBeTrue()
lub.toBe(true)
. Gdybym znalazł przypadek, w którym implementacja zwraca prawdziwe / fałszywe wartości, zgłosiłbym błąd.źródło
W javascript są prawda i prawda. Kiedy coś jest prawdą, jest to oczywiście prawda lub fałsz. Kiedy coś jest prawdziwe, może to być wartość logiczna lub nie, ale wartość „rzutowania” jest wartością logiczną.
Przykłady.
Może to uprościć sprawę, jeśli chcesz sprawdzić, czy ciąg jest ustawiony lub czy tablica ma jakieś wartości.
I jak stwierdzono.
expect(something).toBe(true)
iexpect(something).toBeTrue()
jest taki sam. Aleexpect(something).toBeTruthy()
to nie to samo, co którekolwiek z nich.źródło
[] == false;
nie jest poprawne, samo stwierdzenie jest fałszywe, ponieważ przedmioty są zawsze zgodne z prawdą[] == false;
brzmitrue
[""]==false
lub[0]== false
; nie pusty, nie falsey, po prostu zwodniczy ...x == true
co masz w swoich przykładach, jest mylącym i, jak pokazują powyższe komentarze, niewłaściwym sposobem zilustrowania pojęcia prawdziwości w JavaScript. Prawdziwym testem prawdziwości w JavaScript jest to, jak wartość zachowuje się wif
instrukcji lub jako operand w wyrażeniu boolowskim. Wiemy, że1
jest prawdą, ponieważif (1)
spowoduje, że następne stwierdzenie zostanie ocenione. Podobnie[]
jest z prawdą z tego samego powodu: mimo że szacuje się[] == true
dofalse
,if ([])
nadal spowoduje, że następne zdanie zostanie ocenione, więc wiemy, że[]
jest prawdziwe.Wiem, że wszyscy uwielbiają łatwą do odczytania listę:
toBe(<value>)
- Zwrócona wartość jest taka sama jak<value>
toBeTrue()
- Sprawdza, czy zwrócona wartość totrue
toBeTruthy()
- Sprawdź, czy wartość rzutowana na wartość logiczną będzie zgodna z prawdąWartości Truthy są wszystkie wartości, które nie są
0
,''
(pusty ciąg znaków),false
,null
,NaN
,undefined
lub[]
(pusty tablicy) *.* Zwróć uwagę, że po uruchomieniu
!![]
zwracatrue
, ale po uruchomieniu[] == false
również powracatrue
. To zależy od tego, jak zostanie wdrożone. Innymi słowy:(!![]) === ([] == false)
Na twoim przykładzie
toBe(true)
itoBeTrue()
przyniesie te same wyniki.źródło
alert(!![])
[] == true
w twojej konsoli produkujefalse
.[] == false
w twojej konsoli produkujetrue
Istnieje wiele dobrych odpowiedzi, chciałem tylko dodać scenariusz, w którym wykorzystanie tych oczekiwań może być pomocne. Używając
element.all(xxx)
, jeśli muszę sprawdzić, czy wszystkie elementy są wyświetlane w jednym przebiegu, mogę wykonać -Powodem jest
.all()
zwraca tablicę wartości, a więc wszelkiego rodzaju oczekiwań (getText
,isPresent
itd ...) mogą być wykonywanetoBeTruthy()
, gdy.all()
wchodzi w obraz. Mam nadzieję że to pomoże.źródło
reduce()
zapisałem tablicę wartości logicznych w jednej wartości, a następnie zastosowałemtoBe(true)
sprawdzenie. Dziękuję, to jest o wiele prostsze.