1. ホーム
  2. javascript

[解決済み] MochaでJavascriptをテストする際のassert.equalとassert.deepEqualの違い?

2022-12-08 15:53:05

質問

私は 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 ではなく '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!