Express.jsアプリケーションでMochaを使用して小さなモジュールをテストしています。このモジュールでは、関数の1つが配列を返します。特定の入力に対して配列が正しいかどうかをテストしたい。私はこのようにしています:
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
に変更すると、テストは問題なく合格します。 ==
対===
の場合だろうかと思っていましたが、
[1,2,3] === [1,2,3]
node.jsコマンドラインに入力しても、まだfalseになります。
配列が他の値と比較しないのはなぜですか(例:1 == 1
)?そして、assert.equalとassert.deepEqualの違いは何ですか?
配列が他の値と比較しない理由(例:1 == 1)
数値、文字列、ブール値、null
、およびundefined
は値であり、予想どおりに比較されます。 1 == 1
、'a' == 'a'
など。値の場合の===
と==
の違いは、==
が最初に型変換を実行しようとすることです。そのため、'1' == 1
butnot'1' === 1
。
一方、配列はオブジェクトです。この場合の===
および==
は、オペランドが意味的に等しいことを意味するのではなく、それらが同じオブジェクトを参照することを意味します 。
assert.equalとassert.deepEqualの違いは何ですか?
assert.equal
は上記のように動作します。 ソース内 を見るとわかるように、引数が!=
の場合、実際には失敗します。したがって、数値文字列の配列では失敗します。これらは本質的に同等であるが、同じオブジェクトではないためです。
一方、深い(別名構造)平等は、オペランドが同じオブジェクトであるかどうかをテストするのではなく、同等であるかどうかをテストします。ある意味では、オブジェクトを値であるかのように強制的に比較すると言うことができます。
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!