Katakanlah saya memiliki yang berikut ini:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Kedua tes di atas akan lulus. Apakah ada perbedaan antara toBe()
dan toEqual()
kapan harus mengevaluasi angka? Jika demikian, kapan saya harus menggunakan yang satu dan bukan yang lain?
javascript
jasmine
Lloyd Banks
sumber
sumber
toEqual()
akan dibandingkan dengan kunci / nilai-konten;toBe()
akan membandingkan dengan referensi objek.Jawaban:
Untuk tipe primitif (mis. Angka, boolean, string, dll.), Tidak ada perbedaan antara
toBe
dantoEqual
; salah satu akan bekerja untuk5
,true
atau"the cake is a lie"
.Untuk memahami perbedaan antara
toBe
dantoEqual
, mari kita bayangkan tiga objek.Menggunakan perbandingan yang ketat (
===
), beberapa hal "sama":Tetapi beberapa hal, meskipun mereka "sama", tidak "sama", karena mereka mewakili objek yang hidup di lokasi yang berbeda dalam memori.
toBe
Matcher Jasmine tidak lebih dari pembungkus untuk perbandingan kesetaraan yang ketatadalah hal yang sama dengan
Jangan hanya mengambil kata-kata saya untuk itu; lihat kode sumber untuk toBe .
Tetapi
b
danc
mewakili objek yang secara fungsional setara; mereka berdua terlihat sepertiBukankah lebih bagus jika kita bisa mengatakan itu
b
danc
"setara" walaupun mereka tidak mewakili objek yang sama?Masukkan
toEqual
, yang memeriksa "kesetaraan mendalam" (yaitu melakukan pencarian rekursif melalui objek untuk menentukan apakah nilai untuk kunci mereka setara). Kedua tes berikut akan lulus:Harapan itu membantu memperjelas beberapa hal.
sumber
expect(0).toBe(-0)
akan lulus tetapiexpect(0).toEqual(-0)
akan gagal.toBe
menggunakan kesetaraan yang ketat - bandingkan dengan referensi,toEqual
menggunakan kesetaraan properti. Direkomendasikan untuk digunakantoEqual
untuk primitiftoEqual
jauh lebih berhati-hati tentang kesetaraan (0 != -0
,"hi" = new String("hi")
, dll), jadi saya akan merekomendasikan menggunakantoEqual
secara eksklusif kecuali Anda benar-benar khawatir tentang referensi kesetaraan. Lihat semua cek yangtoEqual
dibuat dalameq
metode di sini: github.com/jasmine/jasmine/blob/master/src/core/matchers/…toBe()
versustoEqual()
:toEqual()
memeriksa kesetaraan.toBe()
, di sisi lain, memastikan bahwa mereka adalah objek yang sama persis.Saya akan mengatakan penggunaan
toBe()
saat membandingkan nilai, dantoEqual()
ketika membandingkan objek.Saat membandingkan tipe primitif,
toEqual()
dantoBe()
akan menghasilkan hasil yang sama. Ketika membandingkan objek,toBe()
adalah perbandingan yang lebih ketat, dan jika bukan objek yang sama persis dalam memori ini akan menghasilkan false. Jadi, kecuali Anda ingin memastikan itu adalah objek yang sama persis dalam memori, gunakantoEqual()
untuk membandingkan objek.Lihat tautan ini untuk info lebih lanjut: http://evanhahn.com/how-do-i-jasmine/
Sekarang ketika melihat perbedaan antara
toBe()
dantoEqual()
ketika datang ke angka, seharusnya tidak ada perbedaan selama perbandingan Anda benar.5
akan selalu setara dengan5
.Tempat yang bagus untuk bermain-main dengan ini untuk melihat hasil yang berbeda ada di sini
Memperbarui
Cara mudah untuk melihat
toBe()
dantoEqual()
memahami apa yang sebenarnya mereka lakukan dalam JavaScript. Menurut Jasmine API, ditemukan di sini :Pada dasarnya apa yang dikatakan adalah
toEqual()
dantoBe()
merupakan===
operator Javascripts yang serupa kecualitoBe()
juga memeriksa untuk memastikan itu adalah objek yang sama persis, dalam contoh di bawah iniobjectOne === objectTwo //returns false
juga. Namun,toEqual()
akan kembali benar dalam situasi itu.Sekarang, Anda setidaknya bisa mengerti mengapa ketika diberikan:
expect(objectOne).toBe(objectTwo); //returns false
Itu karena, sebagaimana tercantum dalam jawaban ini untuk pertanyaan yang berbeda, namun mirip, yang
===
operator yang benar-benar berarti bahwa kedua operan referensi objek yang sama, atau dalam hal jenis nilai, memiliki nilai yang sama.sumber
toEqual()
dengan mengatakan bahwatoEqual()
memeriksa kesetaraan , tetapi pertanyaan berikutnya yang jelas tidak apa - apa, jadi apa artinya "setara"? Deskripsi algoritma yang digunakan untuk menentukan "ekivalensi", atau setidaknya contoh kasus di mana perilakutoEqual()
dantoBe()
perbedaan, akan menjadikan ini lebih berguna.toEqual
harus digunakan untuk perbandingan mendalam antara objek, bukantoBe
. jsfiddle.net/bBL9P/67toEqual
adalah sama sekali tidak sama dengan==
.expect(1).toEqual('1')
gagal, sementara1 == '1'
itu benar.toEqual
tidak ada hubungannya dengan==
. Ini seperti===
kecuali bahwa itu akan membandingkan objek dengan cara yang mirip dengan perbandingan nilai.Mengutip proyek jasmine github,
sumber
Melihat kode sumber Jasmine menjelaskan lebih lanjut tentang masalah ini.
toBe
sangat sederhana dan hanya menggunakan identitas / operator kesetaraan yang ketat,===
:toEqual
, Di sisi lain, hampir 150 garis panjang dan memiliki penanganan khusus untuk dibangun di objek sepertiString
,Number
,Boolean
,Date
,Error
,Element
danRegExp
. Untuk objek lain itu secara rekursif membandingkan properti.Ini sangat berbeda dengan perilaku operator persamaan
==
,. Sebagai contoh:sumber
toEqual()
membandingkan nilai jika Primitif atau konten jika Objek.toBe()
membandingkan referensi.Kode / suite berikut harus jelas:
sumber
Pikir seseorang mungkin menyukai penjelasan dengan contoh (beranotasi):
Di bawah, jika fungsi deepClone () saya melakukan tugasnya dengan benar, tes (seperti yang dijelaskan dalam panggilan 'it ()') akan berhasil:
Tentu saja ini bukan suite tes lengkap untuk deepClone saya (), karena saya belum menguji di sini jika objek literal dalam array (dan yang bersarang di dalamnya) juga memiliki identitas yang berbeda tetapi nilai yang sama.
sumber
Saya pikir toEqual memeriksa sama dalam, toBe adalah referensi yang sama dari 2 variabel
sumber
Poin yang perlu diperhatikan:
toBe()
memperlakukan perbandingan seperti bagaimana caranyaObject.is()
.toEqual()
memperlakukan perbandingan seperti bagaimana caranya===
.Itu sebabnya untuk tipe primitif,
toBe
dantoEqual
tidak memiliki banyak perbedaan saat menguji kesetaraan, tetapi untuk tipe referensi seperti objek, Anda lebih suka menggunakantoEqual
untuk menguji kesetaraan.sumber