2

状況は次のとおりです。オブジェクトの配列を返す関数をテストしたいと思います。オブジェクトには列挙可能なプロパティはありませんが、共通のキャッシュ/ストアから取得されます。

私のテストケースでは、返された配列の内容が正しいかどうかをテストしたいと思います。だから私はそれ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 は 2 つのオブジェクトを異なるものとして認識しますが (最初のテストを参照)、配列を使用するとすぐに違いを認識できません。

だから私は少し遊んで、オブジェクトに列挙可能なプロパティがあり、両方のインスタンスが異なるとすぐに、QUnit はそれを認識します: Changed Fiddle

function Obj( val ){ this._val = val; }

これを使用して列挙可能なプロパティが同じ値に設定されている場合、興味深いことに:

var o1 = new Obj( 1 ),
    o2 = new Obj( 1 );

プロパティがない場合 ( Fiddle )と同じ動作が見られます。

したがって、上記の例を念頭に置いて、

配列の内容をチェックするために QUnit に 2 つのオブジェクトを ID で比較させるにはどうすればよいですか?

ここで@Ilyaとの議論に従って、実際の質問の言い換え:

1つのレベルだけを使用するにはどうすれdeepEqual()ばよいですか?つまり、指定された配列のすべての要素をオブジェクトIDで比較する必要がありますか?

PS:単純な解決策は、配列内の要素ごとに比較することであることは知っていますが、より高速な方法があるはずです。

4

1 に答える 1

0

配列の内容をチェックするために QUnit に 2 つのオブジェクトを ID で比較させるにはどうすればよいですか?

t1 = [ o1, o2 ]t2 = [ o1, o2 ]が異なるオブジェクトであることをテストしたい場合、 equal はまさにそれを行います。

t1 = [ o1, o2 ]逆に、とが等しいことをテストしたい場合はt2 = [ o1, o2 ]、同じオブジェクトを含む配列のケース専用のカスタム アサーションを作成する必要があります。

deepEqualオブジェクトのプロパティを (再帰的に) 評価します。他に何ができますか?

于 2016-01-06T16:54:27.593 に答える