Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript数组克隆相等断言中的疏远行为_Javascript_Arrays_Unit Testing_Mocha.js_Chai - Fatal编程技术网

JavaScript数组克隆相等断言中的疏远行为

JavaScript数组克隆相等断言中的疏远行为,javascript,arrays,unit-testing,mocha.js,chai,Javascript,Arrays,Unit Testing,Mocha.js,Chai,我在JavaScript单元测试中发现了一个失败的断言,我想修复它。单元测试代码如下(可以找到完整代码): 在测试中,我们将克隆一个对象并将其插入数组: objNeedle = {w: 'waffles'}; // original objDupe = JSON.parse(JSON.stringify(objNeedle)); // clone arrContainer = [arrDupe, objDupe, strDupe, numDupe]; // add clone to array

我在JavaScript单元测试中发现了一个失败的断言,我想修复它。单元测试代码如下(可以找到完整代码):

在测试中,我们将克隆一个对象并将其插入数组:

objNeedle = {w: 'waffles'}; // original
objDupe = JSON.parse(JSON.stringify(objNeedle)); // clone
arrContainer = [arrDupe, objDupe, strDupe, numDupe]; // add clone to array
失败的断言检查数组(包含克隆对象)是否不包含原始对象

arrContainer.should.not.contain(objNeedle); // fails
我尝试了一个外部断言,但没有成功:

arrContainer.should.not.include(objNeedle); // fails
arrContainer.should.not.include.something.that.deep.equals(objNeedle); // fails
以下断言通过了测试,但不是理想的解决方案:

arrContainer[0].should.not.equal(objNeedle); // pass
您知道为什么只有在某些情况下阵列才被视为与其克隆相同吗


提前感谢:)

如果您查看ChaiJS代码,您将看到以下内容:

if (_.type(obj) === 'array' && _.type(val) === 'object') {
  for (var i in obj) {
    if (_.eql(obj[i], val)) {
      expected = true;
      break;
    }
  }
}
这在
include(val,msg)
函数中,这是
.contains()
匹配器使用的函数(请参阅)

这意味着,如果
obj
(正在测试的对象)是一个数组,
val
.contains()
matcher函数的参数)是一个对象,就像您的情况一样,它将使用
.eql()
.eql
是外部
deep eql
模块提供/导出的函数的别名)

if (_.type(obj) === 'array' && _.type(val) === 'object') {
  for (var i in obj) {
    if (_.eql(obj[i], val)) {
      expected = true;
      break;
    }
  }
}