情况如下:我想测试我的函数,它返回一个对象数组。这些对象没有可枚举的属性,但是从公共缓存/存储中获取。
在我的测试用例中,我现在想测试返回数组的内容是否正确。所以我假设,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()
用于一个级别 - 这意味着,应该通过对象标识比较给定数组的所有元素?
答案 0 :(得分:0)
如何强制QUnit按身份比较两个对象 检查一个数组的内容?
如果您想测试t1 = [ o1, o2 ]
和t2 = [ o1, o2 ]
是不同的对象,则完全相同。
相反,如果要测试t1 = [ o1, o2 ]
和t2 = [ o1, o2 ]
是否相等,则必须专门为包含相同对象的数组创建自定义断言。
deepEqual
评估(递归)对象的属性,它还能做什么?