首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用Mocha进行Javascript测试时,assert.equal和assert.deepEqual有什么区别?

在使用Mocha进行Javascript测试时,assert.equal和assert.deepEqual有什么区别?
EN

Stack Overflow用户
提问于 2012-11-05 10:37:15
回答 1查看 67.9K关注 0票数 100

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

代码语言:javascript
复制
suite('getWords', function(){
    test("getWords should return list of numbers", function() {
        var result = ['555', '867', '5309'];
        assert.equal(result, getWords('555-867-5309'));
    });
});

当它运行时,我得到以下断言错误:

代码语言:javascript
复制
AssertionError: ["555","867","5309"] == ["555","867","5309"]

但是,当我将测试更改为assert.deepEqual时,测试通过得很好。我想知道这是否是=====的案例,但如果我进入

代码语言:javascript
复制
[1,2,3] === [1,2,3]

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

为什么数组不像其他值那样比较(例如1 == 1)?assert.equal和assert.deepEqual之间的区别是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-05 12:32:34

为什么数组不像其他值那样进行比较(例如1==1)

数字、字符串、布尔值、nullundefined都是值,可以按照预期进行比较。1 == 1'a' == 'a'等。在值的情况下,=====的不同之处在于==将首先尝试执行类型转换,这就是为什么'1' == 1而不是'1' === 1

另一方面,数组是对象。本例中的=====并不表示操作数在语义上相等,而是表示它们引用的是同一个对象。

assert.equal和assert.deepEqual的区别是什么?

assert.equal的行为如上所述。正如您看到的in the source,如果参数为!=,则它实际上会失败。因此,它对于数字字符串数组是失败的,因为尽管它们在本质上是等价的,但它们不是同一个对象。

另一方面,深度(又称结构)相等并不测试操作数是否为相同的对象,而是测试它们是否等价。在某种意义上,你可以说它迫使对象进行比较,就像它们是值一样。

代码语言:javascript
复制
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!
票数 171
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13225274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档