次のようなものがあるとします。
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
上記のテストは両方とも合格します。数値を評価する場合、toBe()
との間に違いはありますか? もしそうなら、いつ一方を使用し、いつ他方を使用しない方がよいですか?toEqual()
ベストアンサー1
toBe
プリミティブ型(数値、ブール値、文字列など)の場合、との間に違いはありません。 、、 のtoEqual
いずれでも機能します。5
true
"the cake is a lie"
toBe
との違いを理解するためにtoEqual
、3 つのオブジェクトを想像してみましょう。
var a = { bar: 'baz' },
b = { foo: a },
c = { foo: a };
厳密な比較 ( ===
) を使用すると、いくつかのものは「同じ」になります。
> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
しかし、いくつかのものは、たとえ「等しい」としても、メモリ内の異なる場所に存在するオブジェクトを表すため、「同じ」ではありません。
> b === c
false
JasmineのtoBe
マッチャーは厳密な等価比較のラッパーに過ぎません
expect(c.foo).toBe(b.foo)
は同じものです
expect(c.foo === b.foo).toBe(true)
私の言うことを鵜呑みにしないで下さい。toBeのソースコード。
しかしb
、とc
機能は同等のオブジェクトを表します。どちらも
{ foo: { bar: 'baz' } }
たとえ同じオブジェクトを表していなくても、とb
が「等しい」と言えるとしたら素晴らしいと思いませんか?c
と入力しますtoEqual
。これは「深い等価性」をチェックします (つまり、オブジェクトを再帰的に検索して、キーの値が等しいかどうかを判断します)。次の両方のテストは合格します。
expect(b).not.toBe(c);
expect(b).toEqual(c);