web-dev-qa-db-ja.com

Jestの「toBe」と「toEqual」の違いは何ですか?

Jestのドキュメントは次のとおりです。

toBeは、値が期待どおりであることを確認するだけです。 ===を使用して、厳密な等価性をチェックします。

toEqualの場合:

2つのオブジェクトの値が同じであることを確認する場合は、.toEqualを使用します。このマッチャーは、オブジェクトの同一性をチェックするのではなく、すべてのフィールドの等価性を再帰的にチェックします。これは「ディープイコール」とも呼ばれます。たとえば、このテストスイートではtoEqualとtoBeの動作が異なるため、すべてのテストに合格します。

    const x = { a: { b: 3 } };
    const y = { a: { b: 3 } };

    expect(x).toEqual(y);
    expect(x).toBe(y);

この場合、toEqualはパスしますが、toBeは失敗します。 toEqualは、deep equalチェックを行うため合格することを理解しています。この場合toBeが失敗するのはなぜですか?

また、toBetoEqualを使用するためのベストプラクティスはありますか(Jestだけでなく、他のテストフレームワークでも)。

24
sshh

xyは異なるインスタンスであり、(x === y) === falseのように等しくないため、失敗します。 toBeを使用する他のすべての文字列、数値、ブール値などのプリミティブにはtoEqualを使用できます。例えば

x = 4 
y = 4
x === y // true

x = 'someString'
y = 'someString'
x === y // true

空のオブジェクトでも等しくない

x = {}
y = {}
x === y //false
24