在使用 Mocha 进行 Javascript 测试时,assert.equal 和 assert.deep equals 之间的区别是什么?

我正在使用 Mocha 测试 Express.js 应用程序中的一个小模块。在这个模块中,我的一个函数返回一个数组。我想测试数组对于给定输入是否正确。我是这样做的:

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时,测试就会通过。我想知道这是否是一个案件的 =====,但如果我进入

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

在 node.js 命令行中,仍然得到 false。

为什么数组不像其他值那样进行比较(例如 1 == 1) ?以及 assert.equals 和 assert.deep equals 之间的区别是什么?

75888 次浏览

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

Numbers, strings, booleans, null, and undefined are values, and are compared as you might expect. 1 == 1, 'a' == 'a', and so on. The difference between === and == in the case of values is that == will attempt to perform type conversion first, which is why '1' == 1 but not '1' === 1.

Arrays, on the other hand, are objects. === and == in this case do not signify that the operands are semantically equal, but that they refer to the same object.

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

assert.equal behaves as explained above. It actually fails if the arguments are !=, as you can see in the source. Thus it fails for your arrays of numbers strings because although they are essentially equivalent, they are not the same object.

Deep (aka structural) equality, on the other hand, does not test whether the operands are the same object, but rather that they're equivalent. In a sense, you could say it forces objects to be compared as though they're values.

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!