Apa perbedaan antara expect(something).toBe(true)
, expect(something).toBeTruthy()
dan expect(something).toBeTrue()
?
Perhatikan bahwa toBeTrue()
adalah matcher kustom diperkenalkan di jasmine-matchers
antara matchers lain yang bermanfaat dan berguna seperti toHaveMethod()
atau toBeArrayOfStrings()
.
Pertanyaannya dimaksudkan untuk menjadi generik, tetapi, sebagai contoh dunia nyata, saya menguji apakah suatu elemen ditampilkan protractor
. Matcher mana yang harus saya gunakan dalam kasus ini?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
.toBe(true)
==.toBeTrue()
. toBeTruthy () bisa benar tidak hanya pada benar , tetapi pada 123 , "dfgdfg", [1,2,3], dll ... pada dasarnyaif(x==true)
adalah kebenaran, sementaraif(x===true)
itu benar benar.toBeTruthy
jika Anda tidak yakin dengan tipe itu sama seperti== true
sementara saya curiga.toBe(true)
sama dengan=== true
Mind Anda sedikit berlebihan untuk memanggil fungsi untuk menguji benar. Kata nasihat, Lupakan==
dan!=
ada di Javascript dan jangan pernah menggunakannya lagi. Kebenaran tidak dibutuhkan dan perangkap untuk pemula. Gunakan===
dan!==
sebagai gantinya.eslint
melaporkan kami jika==
atau!=
digunakan menyarankan untuk mengubahnya ke===
dan!==
.Jawaban:
Apa yang saya lakukan ketika saya bertanya-tanya sesuatu seperti pertanyaan yang diajukan di sini adalah pergi ke sumbernya.
menjadi()
expect().toBe()
didefinisikan sebagai:Itu melakukan tes dengan
===
yang berarti bahwa ketika digunakan sebagaiexpect(foo).toBe(true)
, itu akan berlalu hanya jikafoo
benar-benar memiliki nilaitrue
. Nilai kebenaran tidak akan lulus uji.toBeTruthy ()
expect().toBeTruthy()
didefinisikan sebagai:Ketik paksaan
Nilai benar jika paksaan dari nilai ini ke boolean menghasilkan nilai
true
. Operasi!!
menguji kebenaran dengan memaksa nilai yang diteruskan keexpect
boolean. Perhatikan bahwa sebaliknya untuk apa jawaban yang diterima saat ini menyiratkan ,== true
adalah tidak tes yang benar untuk truthiness. Anda akan mendapatkan hal-hal lucu sepertiSedangkan menggunakan
!!
hasil:(Ya, kosong atau tidak, array itu benar.)
toBeTrue ()
expect().toBeTrue()
adalah bagian dari Jasmine-Matchers (yang didaftarkan pada npm sepertijasmine-expect
setelah proyek selanjutnya terdaftarjasmine-matchers
pertama).expect().toBeTrue()
didefinisikan sebagai:Bedanya dengan
expect().toBeTrue()
danexpect().toBe(true)
adalah bahwaexpect().toBeTrue()
tes apakah itu berurusan denganBoolean
objek.expect(new Boolean(true)).toBe(true)
akan gagal sedangkanexpect(new Boolean(true)).toBeTrue()
akan lulus. Ini karena hal lucu ini:Setidaknya itu benar:
Mana yang paling cocok untuk digunakan
elem.isDisplayed()
?Akhirnya busur derajat menyerahkan permintaan ini ke Selenium. The dokumentasi menyatakan bahwa nilai yang dihasilkan oleh
.isDisplayed()
sebuah janji bahwa resolve keboolean
. Saya akan mengambil nilai nominal dan menggunakan.toBeTrue()
atau.toBe(true)
. Jika saya menemukan kasus di mana implementasinya mengembalikan nilai kebenaran / kepalsuan, saya akan mengajukan laporan bug.sumber
Di javascript ada trues dan truthys. Ketika sesuatu itu benar itu jelas benar atau salah. Ketika sesuatu itu benar itu mungkin atau mungkin bukan boolean, tetapi nilai "pemeran" adalah boolean.
Contohnya.
Ini bisa membuat segalanya lebih sederhana jika Anda ingin memeriksa apakah string disetel atau array memiliki nilai apa pun.
Dan seperti yang dinyatakan.
expect(something).toBe(true)
danexpect(something).toBeTrue()
sama. Tetapiexpect(something).toBeTruthy()
tidak sama dengan keduanya.sumber
[] == false;
tidak benar, pernyataan itu sendiri salah karena objek selalu benar[] == false;
adalahtrue
[""]==false
atau[0]== false
; tidak kosong, tidak falsey, hanya menipu ...x == true
seperti yang Anda miliki dalam contoh Anda adalah menyesatkan dan, seperti yang ditunjukkan oleh komentar di atas, cara yang salah untuk menggambarkan konsep kebenaran dalam JavaScript. Tes sebenarnya dari kebenaran dalam JavaScript adalah bagaimana nilai berperilaku dalamif
pernyataan atau sebagai operan dalam ekspresi boolean. Kami tahu1
benar karenaif (1)
akan menyebabkan pernyataan berikutnya dievaluasi. Demikian juga[]
kebenaran karena alasan yang sama: Meskipun[] == true
dievaluasifalse
,if ([])
masih akan menyebabkan pernyataan berikutnya dievaluasi, jadi kita tahu[]
itu benar.Saya tahu semua orang menyukai daftar yang mudah dibaca:
toBe(<value>)
- Nilai yang dikembalikan sama dengan<value>
toBeTrue()
- Memeriksa apakah nilai yang dikembalikan adalahtrue
toBeTruthy()
- Periksa apakah nilai, ketika dilemparkan ke boolean, akan menjadi nilai yang benarNilai truthy semua nilai-nilai yang tidak
0
,''
(string kosong),false
,null
,NaN
,undefined
atau[]
(array kosong) *.* Perhatikan bahwa ketika Anda menjalankan
!![]
, ia kembalitrue
, tetapi ketika Anda menjalankannya[] == false
juga kembalitrue
. Itu tergantung pada bagaimana itu diterapkan. Dengan kata lain:(!![]) === ([] == false)
Pada contoh Anda,
toBe(true)
dantoBeTrue()
akan menghasilkan hasil yang sama.sumber
alert(!![])
[] == true
di konsol Anda menghasilkanfalse
.[] == false
di Anda konsol menghasilkantrue
Ada banyak jawaban bagus di luar sana, saya hanya ingin menambahkan skenario di mana penggunaan harapan ini mungkin bisa membantu. Menggunakan
element.all(xxx)
, jika saya perlu memeriksa apakah semua elemen ditampilkan pada sekali jalan, saya dapat melakukan -Alasannya
.all()
mengembalikan sebuah array nilai dan segala macam harapan (getText
,isPresent
, dll ...) dapat dilakukan dengantoBeTruthy()
ketika.all()
datang ke dalam gambar. Semoga ini membantu.sumber
reduce()
-sing array booleans menjadi nilai tunggal dan kemudian menerapkantoBe(true)
cek. Ini jauh lebih sederhana, terima kasih.