msh*_*ren 82 javascript arrays testing mocha.js
我正在使用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'));
});
});
Run Code Online (Sandbox Code Playgroud)
当它运行时,我得到以下断言错误:
AssertionError: ["555","867","5309"] == ["555","867","5309"]
Run Code Online (Sandbox Code Playgroud)
但是,当我将测试更改为a时assert.deepEqual
,测试通过正常.我想知道这是否是==
vs 的情况===
,但如果我进入
[1,2,3] === [1,2,3]
Run Code Online (Sandbox Code Playgroud)
进入node.js命令行,我仍然得到假.
为什么数组不像其他值那样比较(例如1 == 1
)?和assert.equal和assert.deepEqual有什么区别?
num*_*407 142
为什么数组不像其他值那样进行比较(例如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!
Run Code Online (Sandbox Code Playgroud)