web-dev-qa-db-fra.com

Existe-t-il une fonction de correspondance d'égalité de tableau qui ignore la position de l'élément dans jest.js?

J'obtiens que .toEqual () vérifie l'égalité de tous les champs pour les objets simples:

expect(
    {"key1":"pink  wool","key2":"diorite"}
).toEqual(
    {"key2":"diorite","key1":"pink wool"}
);

Donc ça passe.

Mais il n'en va pas de même pour les tableaux:

expect(["pink wool", "diorite"]).toEqual(["diorite", "pink wool"]);

Il ne semble pas y avoir de fonction de correspondance qui le fasse dans les documents de plaisanterie, c'est-à-dire qui teste l'égalité de deux tableaux indépendamment de la position de leurs éléments. Dois-je tester chaque élément d'un tableau par rapport à tous les éléments de l'autre et vice versa? Ou existe-t-il un autre moyen?

27
Benjamin H Boruff

Il n'y a pas de méthode intégrée pour comparer les tableaux sans comparer l'ordre, mais vous pouvez simplement trier les tableaux à l'aide de .sort() avant de faire une comparaison:

expect(["ping wool", "diorite"].sort()).toEqual(["diorite", "pink wool"].sort());`

Vous pouvez vérifier l'exemple dans ce violon .

31
biphobe

Mettez les éléments dans un ensemble. Jest sait comment faire correspondre ces derniers.

expect(new Set(["pink wool", "diorite"])).toEqual(new Set(["diorite", "pink wool"]));
15
0xcaff

utilisez expect.arrayContaining()https://jestjs.io/docs/en/expect#expectarraycontainingarray

par exemple.,

expect(["ping wool", "diorite"])
  .toEqual(expect.arrayContaining(["diorite", "pink wool"]));
5
Ulad Kasach

Comme déjà mentionné expect.arrayContaining vérifie si le tableau actual contient le tableau expected en tant que sous-ensemble. Pour vérifier l’équivalence, on peut

  • soit affirmer que la longueur des deux tableaux est la même (mais cela n'entraînerait pas un message d'échec utile)
  • ou affirmer l'inverse: Que le tableau expected contient le tableau actual:
// This is TypeScript, but remove the types and you get JavaScript
const expectArrayEquivalence = <T>(actual:T[], expected: T[]) => {
  expect(actual).toEqual(expect.arrayContaining(expected));
  expect(expected).toEqual(expect.arrayContaining(actual));
};

Cela a toujours le problème que lorsque le test échoue dans la première assertion, on n'est informé que des éléments manquants dans actual et pas des éléments supplémentaires qui ne sont pas dans expected.

2
nitzel