2012-11-05 103 views
54

我正在使用摩卡来测试我的Express.js应用程序中的一个小模块。在这个模块中,我的一个函数返回一个数组。我想测试一个给定的输入数组是否正确。我这样做是这样的:用Mocha测试Javascript中assert.equal和assert.deepEqual的区别?

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

在运行此,我得到以下断言错误:

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

然而,当我改变我的测试,以一个assert.deepEqual,测试通过的罚款。我想知道,如果它是的==的情况下VS ===,但如果我进入

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

到node.js的命令行,我仍然得到错误。

为什么数组不能比较其他值的方式(例如1 == 1)? assert.equal和assert.deepEqual有什么区别?

回答

109

Why do arrays not compare the way other values do (e.g. 1==1)

数字,字符串,布尔值,nullundefined是价值观,正如你可能期望进行比较。 1 == 1,'a' == 'a'等等。值为=====之间的差值是==将尝试首先执行类型转换,这就是为什么'1' == 1但是不是'1' === 1

另一方面,数组是对象。在这种情况下,=====并不意味着操作数在语义上相等,但是它们涉及相同的对象

what is the difference between assert.equal and assert.deepEqual?

assert.equal表现如上所述。如果参数是!=,它实际上会失败,因为您可以看到in the source。因此,它的数组字符串失败,因为虽然它们本质上是等价的,但它们不是同一个对象。

另一方面,深层(aka结构)平等不能检验操作数是否是同一个对象,而是它们是等价的。从某种意义上说,你可以说它强迫对象进行比较,就好像它们是价值观一样。

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! 
+2

'deepEqual()'的很好的解释;在比较直到你真正遇到它之前,你并不是真正想到的东西。 – brandonscript

相关问题