【问题标题】:Use object identities when using QUnit.deepEqual() on an array在数组上使用 QUnit.deepEqual() 时使用对象标识
【发布时间】: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(){}

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

【问题讨论】:

    标签: javascript arrays qunit object-identity


    【解决方案1】:

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

    如果你想测试t1 = [ o1, o2 ]t2 = [ o1, o2 ] 是不同的对象,equal 就是这样做的。

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

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

    【讨论】:

    • 我想测试[ o1 ]不等于[ o2 ],但t1 = [ o1 ]t2 = [ o1 ] 是。
    • assert.equal( [o1], [o1], '' ) 失败的原因与 assert.equal( o1, o2, '' ) 失败的原因相同:属性相同,但对象不同。对我来说似乎是一致的。
    • 好的,公平点,从问题中删除了这句话,但总体问题仍然存在。在数组内部,我只想按对象身份进行比较,称之为“deepEqual-one-level-deep”变体。
    • 恐怕您必须为此创建自己的断言 (arrayEqual ?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多