2012-11-05 9 views
54

私は、Express.jsアプリケーションで小さなモジュールをテストするためにMochaを使用しています。このモジュールでは、私の関数の1つが配列を返します。私は配列が指定された入力に対して正しいかどうかをテストしたい。私はこのようなので、やっている:Mochaを使ったJavascriptテストでassert.equalとassert.deepEqualの違いは?

suite('getWords', function(){ 
    test("getWords should return list of numbers", function() { 
     var result = ['555', '867', '5309']; 
     assert.equal(result, getWords('555-867-5309')); 
    }); 
}); 

これを実行すると、私は、次のアサーションエラーを取得:

AssertionError: ["555","867","5309"] == ["555","867","5309"] 

私はassert.deepEqualに私のテストを変更する場合ただし、テストはうまく合格します。それは=====のケースだった場合、私は思っていたが、私はNode.jsのコマンドラインに

[1,2,3] === [1,2,3] 

を入力すると、私はまだ偽得ます。

アレイは他の値のやり方を比較しないのはなぜですか(例:1 == 1)? assert.equalとassert.deepEqualの違いは何ですか?

答えて

109

Why do arrays not compare the way other values do (e.g. 1==1)

数値、文字列、ブール、null、およびundefinedは値であり、あなたが期待するかもしれないとして比較されます。 1 == 1,'a' == 'a'など。値の場合の=====の違いは、'1' == 1ではなく、'1' === 1であるため、==が最初に型変換を実行しようとしていることです。

一方、配列はオブジェクトです。この場合の=====は、オペランドが意味的に等しいが、は同じオブジェクトを参照しているわけではありません。

what is the difference between assert.equal and assert.deepEqual?

assert.equalは、上記のように動作します。引数が!=の場合は実際には失敗します。in the sourceが表示されます。したがって、本質的には同等ですが、同じオブジェクトではないため、数値ストリングの配列では失敗します。

等価性は、オペランドが同じオブジェクトであるかどうかをテストするのではなく、同等であることをテストします。ある意味では、オブジェクトが値であるかのようにオブジェクトを比較するように強制することができます。

var a = [1,2,3] 
var b = a    // As a and b both refer to the same object 
a == b     // this is true 
a === b    // and this is also true 

a = [1,2,3]   // here a and b have equivalent contents, but do not 
b = [1,2,3]   // refer to the same Array object. 
a == b     // Thus this is false. 

assert.deepEqual(a, b) // However this passes, as while a and b are not the 
         // same object, they are still arrays containing 1, 2, 3 

assert.deepEqual(1, 1) // Also passes when given equal values 

var X = function() {} 
a = new X 
b = new X 
a == b     // false, not the same object 
assert.deepEqual(a, b) // pass, both are unadorned X objects 
b.foo = 'bar' 
assert.deepEqual(a, b) // fail! 
+2

「deepEqual()」の説明あなたが実際にそれを見いだすまで、比較の中であなたが考えているものではありません。 – brandonscript

関連する問題