JestのExpected: ["object", "property"] Received: serializes to the same string について(オブジェクトの値検証)

概要

JestでObjectの値をtoBeで比較するとExpected: ["object", "property"] Received: serializes to the same stringというエラーが発生することがあります。
これはtoBeが厳密比較をしており、オブジェクトや配列の中身が一致していても同じとは判定されないためです。

JavaScriptやTypeScriptで以下のような比較をしても、値の一致ではなく同じメモリ上にあるオブジェクトかどうかで判定するため、一致しないと判定されることと同じ理屈です。

const data = {
  id: 1,
  name: 2,
}

const expected = {
  id: 1,
  name: 2,
}

console.log(data === expected) // false

対応策

tostrictequalを使うことでオブジェクトの値比較をすることができます。 https://jestjs.io/ja/docs/expect#tostrictequalvalue

const data = {
  id: 1,
  name: 2
};

const expected = {
  id: 1,
  name: 2
};

expect(data).toStrictEqual(expected) // true

なおtoEqualという比較関数も存在します。

https://jestjs.io/ja/docs/expect#toequalvalue

しかし、この関数はundefinedの値は評価しないため、{a: undefined, b: 2}{b: 2} は同じであると評価されます。
なのでより厳密に比較するtoStrictEqualがおすすめです。