Perbedaan antara assert.equal dan assert.deepEqual dalam pengujian Javascript dengan Mocha?

94

Saya menggunakan Mocha untuk menguji modul kecil di aplikasi Express.js saya. Dalam modul ini, salah satu fungsi saya mengembalikan array. Saya ingin menguji apakah array sudah benar untuk input yang diberikan. Saya melakukannya seperti ini:

suite('getWords', function(){
    test("getWords should return list of numbers", function() {
        var result = ['555', '867', '5309'];
        assert.equal(result, getWords('555-867-5309'));
    });
});

Saat ini berjalan, saya mendapatkan kesalahan pernyataan berikut:

AssertionError: ["555","867","5309"] == ["555","867","5309"]

Namun, ketika saya mengubah tes saya menjadi tes assert.deepEqual, tes itu berjalan dengan baik. Saya bertanya-tanya apakah itu kasus ==vs ===, tetapi jika saya masuk

[1,2,3] === [1,2,3]

ke baris perintah node.js, saya masih mendapatkan false.

Mengapa array tidak dapat dibandingkan dengan nilai lain (misalnya 1 == 1)? dan apa perbedaan antara assert.equal dan assert.deepEqual?

mshell_lauren
sumber

Jawaban:

161

Mengapa array tidak membandingkan seperti nilai-nilai lain (misalnya 1 == 1)

Angka, string, boolean, nulldan undefinedadalah nilai, dan dibandingkan seperti yang Anda harapkan. 1 == 1,, 'a' == 'a'dan seterusnya. Perbedaan antara ===dan ==dalam kasus nilai adalah yang ==akan mencoba melakukan konversi jenis terlebih dahulu, itulah sebabnya '1' == 1tetapi tidak '1' === 1 .

Array, di sisi lain, adalah objek. ===dan ==dalam hal ini tidak menandakan bahwa operan secara semantik sama, tetapi merujuk ke objek yang sama .

Apa perbedaan antara assert.equal dan assert.deepEqual?

assert.equalberperilaku seperti yang dijelaskan di atas. Sebenarnya gagal jika argumennya !=, seperti yang Anda lihat di sumbernya . Jadi itu gagal untuk array string bilangan Anda karena meskipun pada dasarnya setara, mereka bukan objek yang sama.

Persamaan mendalam (alias struktural), di sisi lain, tidak menguji apakah operan adalah objek yang sama, melainkan setara. Dalam arti tertentu, Anda bisa mengatakan itu memaksa objek untuk dibandingkan seolah-olah mereka adalah nilai.

var a = [1,2,3]  
var b = a              // As a and b both refer to the same object
a == b                 // this is true
a === b                // and this is also true

a = [1,2,3]            // here a and b have equivalent contents, but do not
b = [1,2,3]            // refer to the same Array object.
a == b                 // Thus this is false.

assert.deepEqual(a, b) // However this passes, as while a and b are not the 
                       // same object, they are still arrays containing 1, 2, 3

assert.deepEqual(1, 1) // Also passes when given equal values

var X = function() {}
a = new X
b = new X
a == b                 // false, not the same object
assert.deepEqual(a, b) // pass, both are unadorned X objects
b.foo = 'bar'
assert.deepEqual(a, b) // fail!
nomor 1311407
sumber
4
Penjelasan bagus tentang deepEqual(); bukan sesuatu yang Anda pikirkan dalam perbandingan sampai Anda benar-benar menemukannya.
brandonscript