web-dev-qa-db-fra.com

Utilisation des équivalents de propriétés Jest sur des tableaux d'objets

J'essaie d'utiliser la nouvelle fonctionnalité Property Matcher de Jest (depuis Jest 23.0. ) pour faire correspondre un tableau d'objets contenant un champ généré. J'ai essayé de mettre à la fois un objet simple et une définition de correspondance en utilisant expect.arrayContaining et expect.objectContaining comme je pourrais le faire lors d'une correspondance manuelle. Y a-t-il un moyen de le faire actuellement?

const sportsBallPeople = [
  {
    createdAt: new Date(),
    name: 'That one famous guy from Cleveland'
  },
  {
    createdAt: new Date(),
    name: 'That tall guy'
  }
];
expect(sportsBallPeople).toMatchSnapshot(<something goes here>);
15
giodamelio

Informations sur la version

Comme cela est noté dans la question, les comparateurs de propriétés ont été introduits dans Jest 23.0.0. Notez que les applications démarrées avec create-react-app à partir d'aujourd'hui (5 août 2018) sont toujours <23.

[~ # ~] objet [~ # ~]

Voici un exemple d'utilisation d'un comparateur de propriétés pour un seul objet:

test('sportsBallPerson', () => {
  expect(sportsBallPeople[0]).toMatchSnapshot({
    createdAt: expect.any(Date)
  })
});

L'instantané généré:

exports[`sportsBallPerson 1`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That one famous guy from Cleveland",
}
`;

Cela correspondra correctement à createdAt à n'importe quelle date et le nom exactement "Ce seul gars célèbre de Cleveland".

[~ # ~] tableau [~ # ~]

Pour tester un tableau d'objets à l'aide des équivalents de propriétés, utilisez forEach pour parcourir le tableau et tester instantanément chaque objet individuellement:

test('sportsBallPeople', () => {
  sportsBallPeople.forEach((sportsBallPerson) => {
    expect(sportsBallPerson).toMatchSnapshot({
      createdAt: expect.any(Date)
    });
  });
});

Les instantanés générés:

exports[`sportsBallPeople 1`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That one famous guy from Cleveland",
}
`;

exports[`sportsBallPeople 2`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That tall guy",
}
`;

forEach garantit que les objets sont testés dans l'ordre, et chaque objet est correctement testé instantané comme décrit ci-dessus.

Informations supplémentaires

Il est intéressant de noter que le test direct d'un tableau à l'aide d'appariements de propriétés ne fonctionne pas correctement et a des effets secondaires inattendus.

Ma première tentative de test d'un tableau a été de créer le test suivant:

test('sportsBallPeople as array', () => {
  expect(sportsBallPeople).toMatchSnapshot([
    { createdAt: expect.any(Date) },
    { createdAt: expect.any(Date) }
  ]);
});

Il a généré l'instantané suivant:

exports[`sportsBallPeople as array 1`] = `
Array [
  Object {
    "createdAt": Any<Date>,
  },
  Object {
    "createdAt": Any<Date>,
  },
]
`;

Ceci est incorrect car les propriétés de nom sont manquantes, mais le test réussit toujours (Jest v23.4.2). Le test réussit même si les noms sont modifiés et des propriétés supplémentaires sont ajoutées.

Plus intéressant encore, dès que ce test a été exécuté, tous les tests suivants utilisant des comparateurs de propriétés ont été affectés de manière négative. Par exemple, placer ce test avant le test en boucle sur les objets a changé ces instantanés comme suit:

exports[`sportsBallPeople 1`] = `
Object {
  "createdAt": Any<Date>,
}
`;

exports[`sportsBallPeople 2`] = `
Object {
  "createdAt": Any<Date>,
}
`;

En résumé, le passage direct d'un tableau à utiliser avec des équivalents de propriétés ne fonctionne pas et peut affecter négativement d'autres tests de capture instantanée à l'aide des équivalents de propriétés.

15