1. ホーム
  2. javascript

[解決済み] JasmineのJavaScriptテスト - toBeとtoEqualの比較

2022-03-23 07:10:40

質問

例えば、次のようなものがあるとします。

var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);

上記のテストは両方ともパスします。の間に違いはありますか? toBe()toEqual() は、数字を評価するときに使うのでしょうか?もしそうなら、どのような場合に一方を使い、他方を使わない方がいいのでしょうか?

どのように解決するのですか?

プリミティブ型(数値、ブーリアン、文字列など)の場合、以下のような違いはありません。 toBetoEqual には、どちらを使ってもかまいません。 5 , true または "the cake is a lie" .

との違いを理解するために toBetoEqual のように、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

しかし、あるものは、たとえquot;equot;であっても、メモリ内の異なる場所に住むオブジェクトを表すため、quot;同じquot;ではないのである。

> b === c
false

ジャスミンの toBe マッチャーは厳密な等式比較のラッパーに過ぎません。

expect(c.foo).toBe(b.foo)

とは同じものです。

expect(c.foo === b.foo).toBe(true)

私の言葉を鵜呑みにせず、以下をご覧ください。 toBeのソースコード .

しかし bc は機能的に等価なオブジェクトを表し、どちらも次のようになります。

{ foo: { bar: 'baz' } }

と言えるとしたら、素晴らしいことだと思いませんか? bc は、同じオブジェクトを表現していなくても、等しいのでしょうか?

入る toEqual これは、quot;deep equality" をチェックします(つまり、オブジェクトを再帰的に検索して、キーの値が等価であるかどうかを判断します)。次のテストは両方ともパスします。

expect(b).not.toBe(c);
expect(b).toEqual(c);

これで、いくつかのことが明確になったかと思います。