用Mocha测试Javascript中assert.equal和assert.deepEqual的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (34)

我正在使用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"]

但是,当我将测试更改为an时assert.deepEqual,测试通过的很好。我想知道这是否是==vs 的情况===,但是如果我输入

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

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

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

提问于
用户回答回答于

为什么数组不能比较其他值的方式(例如1 == 1)

数字,字符串,布尔值,null以及undefined是值,并按照您的预期进行比较。 1 == 1'a' == 'a'等等。之间的差=====在值的情况是,==将试图首先执行类型转换,这是为什么'1' == 1,但 '1' === 1

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

assert.equal和assert.deepEqual有什么区别?

assert.equal表现如上所述。如果参数为真!=,它实际上会失败,就像你在源代码中看到的那样。因此,它的数组字符串失败,因为虽然它们本质上是等价的,但它们不是同一个对象。

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

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!

扫码关注云+社区