LoginSignup
5
4

More than 1 year has passed since last update.

toBe(),toEqual(),toStrictEqual()でオブジェクトや配列を比較する時の違いを知る

Last updated at Posted at 2023-03-18

GPT-4さんとの会話を楽しんでします。
最近はjestのテストについて勉強中なので、その質問のやりとりがメインとなっています。

今回は、toBe(),toEqual(),toStrictEqual()についてAIのユイに聞きながら学習を進めていました。
それぞれでオブジェクトを比較する時、どのような違いがあるのか見ていきましょう。

toBe(),toEqual(),toStrictEqual を使い分ける

まずそれぞれの役割を理解します。

toBEを使うケース

  • プリミティブ値を評価する
  • 同じオブジェクトの参照を持つ変数かを評価する

toEqualを使うケース

  • オブジェクトのプロパティの値を評価する

toStrictEqualを使うケース

  • クラスや、配列内の未定義(undefined)なプロパティを含む、厳密なオブジェクトの評価する

toBe()を使ってみる

toBeの場合基本的にプリミティブ型のテストとして使いますが、オブジェクトのテストとしても使えます。
ただし、toBeは参照も見ているので使用するときは注意が必要です

    const obj1 = { a: 1, b: 2 };
    const obj2 = { a: 1, b: 2 };
    const obj3 = obj1;
    expect(obj1).toBe(obj3); // 参照が同じためtrue
    expect(obj1).toBe(obj2); // 参照が違うためコケる。

    const arr1 = [1, 2];
    const arr2 = [1, 2];
    const arr3 = arr1;
    expect(arr1).toBe(arr3); // 参照が同じためtrue
    expect(arr1).toBe(arr2); // 参照が違うためコケる。

toEqual()を使ってみる

単純に値が同じかどうかを調べたい場合、toEqual() を使用するのがシンプルです。

    const obja = { a: 1, b: 2 };
    const objb = { b: 2, a: 1 };
    expect(obja).toEqual(objb); // 参照が違っても値が同じなのでtrue
    
    const arra = [4, 5];
    const arrb = [4, 5];
    const arrc = [5, 4];
    expect(arra).toEqual(arrb); // 参照が違っても値が同じなのでtrue
    expect(arra)
.toEqual(arrc); // 順序が違うのでコケます

toStrictEqual()を使ってみる

オブジェクトや配列の値だけでなく、プロトタイプも含めた厳密な比較を行います。
まずはtoEqual()と同等の比較を行ってみます。

    const obja = { a: 1, b: 2 };
    const objb = { b: 2, a: 1 };
    expect(obja).toStrictEqual(objb); //成功する

    // 未定義とundefinedを区別しないので成功します
    expect([, undefined, 1]).toEqual([, , 1]); 

オブジェクトの値の比較についてtoEqual()と同様の結果が得られることがわかりました。
続いて、オブジェクトのプロトタイプが違う時を見てみます。

    function Obja() {
      this.a = 1;
    }
    function Objb() {
      this.a = 1;
    }
    expect(Obja).toEqual(Objb); // プロトタイプが違うのでコケます

    const Objc = () => {
      this.a = 1;
    };
    const Objd = () => {
      this.a = 1;
    };
    expect(Objc).toEqual(Objd); // プロトタイプが違うのでコケます

    // 未定義とundefinedを厳密に区別します。
    expect([, undefined, 1]).not.toStrictEqual([, , 1]); 
});

Q - プロトタイプってなんだろう?
A - オブジェクトが他のオブジェクトから継承する仕組み(継承親の値を探しにいく)

(ググるよりいいな)

まとめ

toBe(),toEqual(),toStrictEqual()でオブジェクトや配列を比較する時の違いを見ていきました。
toBe(),toEqual() はよく使いそうですが、toStrictEqual()はそれほど出番がないように感じます。
ただ、どのようなマッチャーが存在しおり、それぞれどう違うのかを学んでおくことは大切です。
適切なマッチャーを即座に選択できるようこれからも学習を進めます。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4