与摩卡的Javascript测试assert.equal和assert.deepEqual的区别?(

2019-07-03 14:06发布

我使用的是摩卡来测试我的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 ,测试通过的罚款。 我想知道,如果它是的情况下== VS === ,但如果我进入

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

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

为什么阵列比不上其他的方式做值(如1 == 1 )? 是什么assert.equal和assert.deepEqual之间的区别?

Answer 1:

为什么阵列比不上其他的方式做值(如1 == 1)

数字,字符串,布尔值, nullundefined是价值观,正如你可能期望进行比较。 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!


文章来源: The difference between assert.equal and assert.deepEqual in Javascript testing with Mocha?