JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Jasmine.jsで配列を比較する方法:toBeとtoEqualの使い分け

JavaScriptでテストコードを書く際、配列同士を比較する場面はよくあります。Jasmineでは、配列の比較は大きく次の2つのパターンに分けられます。

  • 両者がメモリ上の同一の配列オブジェクトを参照している
  • 参照先は異なるオブジェクトだが、中身(要素)がすべて等しい

ケース1:参照の一致を確認する「toBe」

ケース1のように、同じオブジェクトへの参照かどうかを確認したい場合は、toBeマッチャーを使用します。toBeは厳密等価演算子(===)と同様に、参照の一致をチェックします。

例を見てみましょう。

サンプルコード

describe("Array Equality", () => {
    it("should check for array reference equality", () => {
        let arr = [1, 2, 3];
        let arr2 = arr;
        // arr2はarrと同じオブジェクトを参照しているため成功する
        expect(arr).toBe(arr2);
        // 参照が異なるため失敗する
        expect(arr).toBe([1, 2, 3]);
    });
});

実行結果

Array Equality should check for array equality
Message:
    Expected [ 1, 2, 3 ] to be [ 1, 2, 3 ]. Tip: To check for deep equality, use .toEqual() instead of .toBe().

このように、[1, 2, 3]という要素を持つ新しい配列を作成して比較すると、見た目は同じでも参照が異なるためテストは失敗します。エラーメッセージにも「深い等価性を確認したい場合は.toEqual()を使う」というヒントが表示されます。

ケース2:内容の一致を確認する「toEqual」

ケース2のように、参照先が異なっていても配列の中身が同じであれば合格させたい場合は、toEqualマッチャーを使用します。toEqualは配列やオブジェクトの構造を再帰的にたどって比較する、いわゆるディープ比較(deep equality)を行います。

サンプルコード

describe("Array Equality", () => {
    it("should check for array content equality", () => {
        let arr = [1, 2, 3];
        let arr2 = arr;
        // 同じ参照なので成功する
        expect(arr).toEqual(arr2);
        // 中身が同じなら別のオブジェクトでも成功する
        expect(arr).toEqual([1, 2, 3]);
    });
});

実行結果

1 spec, 0 failures

今度はどちらのexpectも成功し、「0 failures」と表示されます。

まとめ

マッチャー比較方法用途
toBe参照の一致(===相当)同一インスタンスであることを確認したい場合
toEqualディープ比較(構造・値の一致)中身が同じかどうかを確認したい場合

配列やオブジェクトのテストでは、意図に応じてtoBetoEqualを正しく使い分けることが重要です。基本的に「値が同じかどうか」を確認したい場面が多いため、迷ったらtoEqualを選ぶのが安全です。

  1. JavaScriptにおける配列とSetの違いとは?重複値の扱いと要素アクセスをわかりやすく解説

    JavaScriptのSet(セット)オブジェクトは、ES2015(ES6)で新たに導入されたデータ型です。従来から広く使われている配列(Array)と比べると、いくつか重要な違いがあります。 配列とSetの主な違い 重複した値の扱い: 配列は同じ値をいくつでも格納できますが、Setでは同一の値は1つしか保持されません。重複した値は自動的に除外されるのが大きな特徴です。 要素へのアクセス方法: 配列ではインデックス(例:arr[0])を使って任意の位置の要素へ直接アクセスできます。一方、Setにはインデックスの概念がなく、要素は挿入された順序どおりに先頭から順番に辿ることしかできません。

  2. JavaScriptで配列をreduceする方法|reduce()メソッドで配列要素を合計する

    JavaScriptのreduce()メソッドは、配列の各要素を先頭から順に処理し、その結果を1つの値にまとめる(畳み込む)ための配列メソッドです。数値の合計を求めるだけでなく、配列からオブジェクトを組み立てたり、条件に応じてデータを集約したりと、幅広い場面で活用されています。reduce()メソッドの基本構文 { return 戻り値; }, 初期値);accumulator(アキュムレータ):直前のコールバック関数が返した値(累積値)。最初のループでは初期値、または配列の第1要素が代入されます。currentValue:現在処理している配列の要素。初期値:累積値の出発点となる値。省略し