状況は次のとおりです。オブジェクトの配列を返す関数をテストしたいと思います。オブジェクトには列挙可能なプロパティはありませんが、共通のキャッシュ/ストアから取得されます。
私のテストケースでは、返された配列の内容が正しいかどうかをテストしたいと思います。だから私はそれ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:単純な解決策は、配列内の要素ごとに比較することであることは知っていますが、より高速な方法があるはずです。