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