Jasmine JavaScript テスト - toBe と toEqual の比較 質問する

Jasmine JavaScript テスト - toBe と toEqual の比較 質問する

次のようなものがあるとします。

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

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

ベストアンサー1

toBeプリミティブ型(数値、ブール値、文字列など)の場合、との間に違いはありません。 、、 のtoEqualいずれでも機能します。5true"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);

おすすめ記事