【发布时间】:2016-04-10 19:26:58
【问题描述】:
情况如下:我想测试我的一个函数,它返回一个对象数组。这些对象没有可枚举的属性,而是取自一个公共缓存/存储。
在我的测试用例中,我现在想测试返回数组的内容是否正确。所以我假设,deepEqual() 将是要使用的函数,但测试实际上返回了这个(减少了一点测试用例):
QUnit.test( "array of objects", function( assert ) {
// create two objects
var o1 = new Obj( 1 ),
o2 = new Obj( 2 );
// compare objects themselves
assert.notEqual( o1, o2, 'different objects' ); // success
// compare identical arrays
assert.deepEqual( [ o1 ], [ o1 ], 'identical arrays - deepEqual' ); // success
// compare different arrays
assert.notDeepEqual( [ o1 ], [ o2 ], 'different arrays - deepEqual' ); // fail
});
// some sample object
function Obj(){}
(我还测试了propEqual(),看看它是否在这里工作。)
所以 QUnit 将这两个对象识别为不同的(参见第一个测试),但在我使用数组时无法识别差异。
所以我玩了一点,一旦我的对象上有一个可枚举的属性,其中两个实例不同,QUnit 就会识别它:Changed Fiddle
function Obj( val ){ this._val = val; }
有趣的是,如果通过使用以下方法将可枚举属性设置为相同的值:
var o1 = new Obj( 1 ),
o2 = new Obj( 1 );
我看到与没有属性相同的行为 (Fiddle)。
所以,考虑到上面的例子,
如何强制 QUnit 按身份比较两个对象以检查数组的内容?
根据与@Ilya 的讨论,这里是实际问题的改写:
我如何仅将deepEqual() 用于一个级别 - 意思是,给定数组的所有元素都应按对象标识进行比较?
PS:我知道天真的解决方案是逐个元素比较数组中的元素,但我认为应该有更快的方法。
【问题讨论】:
标签: javascript arrays qunit object-identity