在数组上使用QUnit.deepEqual()时使用对象标识

时间:2016-01-06 16:12:57

标签: javascript arrays qunit object-identity

情况如下:我想测试我的函数,它返回一个对象数组。这些对象没有可枚举的属性,但是从公共缓存/存储中获取。

在我的测试用例中,我现在想测试返回数组的内容是否正确。所以我假设,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(){}

Fiddle for the testcase

(我还测试了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:我知道天真的解决方案是在数组中逐个元素进行比较,但我认为应该有更快的方法。

1 个答案:

答案 0 :(得分:0)

  

如何强制QUnit按身份比较两个对象   检查一个数组的内容?

如果您想测试t1 = [ o1, o2 ]t2 = [ o1, o2 ]是不同的对象,则完全相同。

相反,如果要测试t1 = [ o1, o2 ]t2 = [ o1, o2 ]是否相等,则必须专门为包含相同对象的数组创建自定义断言。

deepEqual评估(递归)对象的属性,它还能做什么?