JavaScript 数组克隆相等断言中的远程行为
Estrange behaviour in JavaScript array clone equality assertion
我在 JavaScript 单元测试中发现了一个失败的断言,我想修复它。单元测试代码如下(完整代码可在此处找到):
beforeEach(function() {
arrNeedle = ['waffles'];
objNeedle = {w: 'waffles'};
strNeedle = 'waffles';
numNeedle = 3.14159
arrDupe = JSON.parse(JSON.stringify(arrNeedle));
objDupe = JSON.parse(JSON.stringify(objNeedle));
strDupe = JSON.parse(JSON.stringify(strNeedle));
numDupe = JSON.parse(JSON.stringify(numNeedle));
arrContainer = [arrDupe, objDupe, strDupe, numDupe];
objContainer = {
arr: arrDupe
, obj: objDupe
, str: strDupe
, num: numDupe
};
arrMissing = ['chan'];
objMissing = {missing: 'chan'}
strMissing = 'chan';
});
it("has its test set up correctly", function() {
arrNeedle.should.not.equal(arrDupe);
objNeedle.should.not.equal(objDupe);
arrContainer.should.not.contain(arrNeedle);
arrContainer.should.not.contain(objNeedle); // fails
objContainer.arr.should.not.equal(arrNeedle);
objContainer.obj.should.not.equal(objNeedle);
});
在测试中,我们克隆一个对象并将其插入到数组中:
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
我尝试使用外部断言插入(chai-things),但没有运气:
arrContainer.should.not.include(objNeedle); // fails
arrContainer.should.not.include.something.that.deep.equals(objNeedle); // fails
以下断言通过了测试,但不是理想的解决方案:
arrContainer[0].should.not.equal(objNeedle); // pass
您知道为什么数组只在某些情况下被视为等于它的克隆吗?
提前致谢:)
如果你看一下 ChaiJS 代码,你会在/lib/chai/core/assertions 的第 189 行看到以下内容.js:
if (_.type(obj) === 'array' && _.type(val) === 'object') {
for (var i in obj) {
if (_.eql(obj[i], val)) {
expected = true;
break;
}
}
}
这是在include(val, msg)
函数内部,这是.contains()
匹配器使用的函数(参见第 215 行)。
这意味着,如果obj
(被测试的东西)是一个数组,而val
(.contains()
匹配器函数的参数)是一个对象,就像你的情况一样,它将使用 _.eql()
检查深度相等性(_.eql
是外部deep-eql
模块提供/导出的函数的别名)。
相关文章:
- 如何在映射数组中添加换行符
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在jQuery中获取表的行索引
- 使用jquery将mysql数据获取到新的表行中
- 如何删除多行HTML排列中的空白
- 如何在Google柱状图中动态添加行/列
- Jquery在函数之间传递表行
- 如何从rails中的代码中删除新行( )
- 使用jQuery动态添加表并在其中动态添加行
- jquery.each(第2行)添加背景色
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- NodeJS-readline暂停和恢复事件发射器(逐行读取)
- 可以'我不明白为什么;t将行和单元格添加到表中
- RubyonRails中的可点击表行
- Jquery行删除对我不起作用,如何设置它
- 是否可以添加这行“;“照原样”;在HTML标记中
- 将行添加到具有固定标题的HTML表中
- 节点.js MongoDB驱动程序文档中的断言模块