256 votes

Comment réinitialiser le nombre d'appels aux fonctions fantaisie de Jest avant chaque test ?

Je suis nouveau dans Jest, j'essaie de l'utiliser pour tester si une fonction a été appelée ou non. J'ai remarqué que mock.calls.length ne se réinitialise pas à chaque test mais s'accumule. Comment puis-je faire en sorte qu'elle soit égale à 0 avant chaque test ? Je ne veux pas que mes prochains tests dépendent des résultats des précédents.

Je sais qu'il y a beforeEach dans Jest - dois-je l'utiliser ? Quelle est la meilleure façon de réinitialiser mock.calls.length ? Merci.

Un exemple de code :

Sum.js :

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

400voto

Alex Efremov Points 743

Une façon que j'ai trouvée pour gérer cela : effacer la fonction fantaisie après chaque test :

À ajouter à Sum.test.js :

afterEach(() => {
  local.getData.mockClear();
});

Si vous souhaitez effacer toutes les fonctions fantaisie après chaque test, utilisez clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});

2 votes

Je suis curieux de savoir s'il y a un moyen de le faire pour toutes les méthodes de l'objet simulé. Lorsque j'essaie local.mockClear() ça ne marche pas.

44 votes

Avez-vous essayé d'utiliser jest.clearAllMocks() ? Docs : jestjs.io/docs/en/jest-object#jestclearallmocks

2 votes

@AlexEfremov, merci beaucoup pour le jest.clearAllMocks() fonction ! J'ai utilisé mockClear() para jest.mock et apparemment les mocks n'ont pas été complètement effacés d'une manière ou d'une autre (les appels de fonctions espions à l'intérieur des classes mock n'ont pas été effacés). Cela a entraîné des erreurs de différence d'instance d'objet vraiment ennuyeuses : Compared values have no visual difference. .

60voto

Daniel Marín Points 426

Comme l'a souligné @AlexEfremov dans les commentaires. Vous pouvez utiliser clearAllMocks après chaque test :

afterEach(() => {
    jest.clearAllMocks();
});

Gardez à l'esprit que cela effacera le nombre d'appels de chaque fonction fantaisie que vous avez, mais c'est probablement la bonne façon de procéder.

39voto

Andrey Vetlugin Points 132

Vous pouvez configurer Jest pour réinitialiser les mocks après chaque test en mettant ceci dans votre jest.config.js :

module.exports = {
  resetMocks: true,
};

Voici la documentation relative à ce paramètre de configuration : https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [booléen]

Valeur par défaut : false

Réinitialisation automatique de l'état de l'objet fictif avant chaque test. Equivalent à l'appel de jest.resetAllMocks() avant chaque test. Cela conduira à la suppression des implémentations fictives des objets fantaisie mais ne restaurera pas leur implémentation initiale.

0voto

Ivan Points 25

Vous pouvez ajouter l'option --resetMocks à la commande : npx jest --resetMocks

Réinitialisation automatique de l'état de l'objet fictif entre chaque test. Equivalent à appeler jest.resetAllMocks()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X