情况如下:我想测试我的一个函数,它返回一个对象数组。这些对象没有可枚举的属性,而是取自一个公共缓存/存储。
在我的测试用例中,我现在想测试返回数组的内容是否正确。所以我假设,这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 );
我看到与没有属性(小提琴)相同的行为。
所以,考虑到上面的例子,
如何强制 QUnit 按身份比较两个对象以检查数组的内容?
根据与@Ilya 的讨论,这里对实际问题进行了改写:
我怎样才能deepEqual()
只使用一个级别 - 意思是,给定数组的所有元素都应该通过对象标识进行比较?
PS:我知道天真的解决方案是逐个元素比较数组中的元素,但我认为应该有更快的方法。