web-dev-qa-db-fra.com

Comment espionner une fonction exportée par défaut avec Jest?

Supposons que j'ai un simple fichier exportant une fonction par défaut:

// UniqueIdGenerator.js
const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);

export default uniqueIdGenerator;

Que j'utiliserais comme ceci:

import uniqueIdGenerator from './UniqueIdGenerator';
// ...
uniqueIdGenerator();

Je veux affirmer dans mon test que cette méthode a été appelée tout en conservant la fonctionnalité d'origine. Je ferais ça avec jest.spyOn cependant, il nécessite un objet ainsi qu'un nom de fonction comme paramètres. Comment pouvez-vous faire cela d'une manière propre? Il y a un --- problème GitHub pour jasmine pour toute personne intéressée.

18
thisismydesign

J'ai fini par abandonner l'exportation par défaut:

// UniqueIdGenerator.js
export const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);

Et puis je pourrais l'utiliser et l'espionner comme ceci:

import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'uniqueIdGenerator');

Certains recommandent les envelopper dans un objet const et les exporter. Je suppose que vous pouvez également utiliser une classe pour l'habillage.

Cependant, si vous ne pouvez pas modifier la classe, il existe toujours une solution (pas si agréable):

import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'default');
25
thisismydesign