web-dev-qa-db-fra.com

Quelle est la différence entre «toBe» et «toEqual» dans Jest?

La documentation Jest se lit comme suit:

toBe vérifie simplement qu'une valeur correspond à ce que vous attendez. Il utilise === pour vérifier une stricte égalité.

Et pour toEqual:

Utilisez .toEqual pour vérifier que deux objets ont la même valeur. Ce matcher vérifie de manière récursive l'égalité de tous les champs, plutôt que de vérifier l'identité de l'objet, ce qui est également appelé "égal profond". Par exemple, toEqual et toBe se comportent différemment dans cette suite de tests, donc tous les tests réussissent.

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

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

Dans ce cas, toEqual réussit mais toBe échoue. Je comprends que toEqual passe car il effectue une vérification égal profond. Pourquoi toBe échoue dans ce cas?

Existe-t-il également des meilleures pratiques pour l'utilisation de toBe et toEqual (pas seulement dans Jest mais aussi dans d'autres frameworks de test)?

24
sshh

Il échoue car x et y sont des instances différentes et différentes comme dans (x === y) === false. Vous pouvez utiliser toBe pour les primitives comme les chaînes, les nombres ou les booléens pour tout le reste, utilisez toEqual. Par exemple

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

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

Même les objets vides ne sont pas égaux

x = {}
y = {}
x === y //false
24
Andreas Köberle