65 votes

Comment simuler les méthodes des composants React avec jest et enzyme ?

J'ai un composant react (simplifié afin de démontrer le problème) :

class MyComponent extends Component {
    handleNameInput = (value) => {
        this.searchDish(value);
    };

    searchDish = (value) => {
      //Do something
    }

    render() {
        return(<div></div>)
    }
}

Maintenant, je veux tester que handleNameInput() appelle searchDish avec la valeur fournie.

Pour ce faire, je voudrais créer une fonction fantaisie jest qui remplace la méthode des composants.

Voici mon cas d'essai jusqu'à présent :

it('handleNameInput', () => {
   let wrapper = shallow(<MyComponent/>);
   wrapper.searchDish = jest.fn();
   wrapper.instance().handleNameInput('BoB');
   expect(wrapper.searchDish).toBeCalledWith('BoB');
})

Mais tout ce que j'obtiens dans la console est SyntaxError :

Erreur de syntaxe

  at XMLHttpRequest.open (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:458:15)
  at run_xhr (node_modules/browser-request/index.js:215:7)
  at request (node_modules/browser-request/index.js:179:10)
  at DishAdmin._this.searchDish (src/main/react/components/DishAdmin.js:155:68)
  at DishAdmin._this.handleNameInput (src/main/react/components/DishAdmin.js:94:45)
  at Object.<anonymous> (src/main/react/tests/DishAdmin.test.js:122:24)

Ma question est donc la suivante : comment faire pour que les méthodes des composants soient correctement simulées avec l'enzyme ?

0 votes

Quelle est l'erreur de syntaxe ?

0 votes

Ajouté à la question :)

0 votes

Sans savoir précisément quelle est la source, il est impossible d'aider - je ne vois aucune erreur de syntaxe dans le code que vous avez posté.

107voto

Miha Šušteršič Points 3549

La méthode peut être simulée de cette façon :

it('handleNameInput', () => {
   let wrapper = shallow(<MyComponent/>);
   wrapper.instance().searchDish = jest.fn();
   wrapper.update();
   wrapper.instance().handleNameInput('BoB');
   expect(wrapper.instance().searchDish).toBeCalledWith('BoB');
})

Vous devez également appeler .update sur le wrapper du composant testé afin d'enregistrer correctement la fonction fantaisie.

L'erreur de syntaxe provenait d'une mauvaise affectation (vous devez affecter la méthode à l'instance). Mes autres problèmes provenaient du fait que je n'appelais pas .update() après avoir simulé la méthode.

0 votes

Pour moi, une erreur se produit avec expect(wrapper.searchDish) - pas une fonction ou un espion fictif. Ce n'est que lorsque je passe à expect(wrapper.instance().searchDish) il fonctionne correctement.

0 votes

@NikSumeiko même je recevais la même erreur, j'ai stocké la fonction fantaisie dans une variable et vérifié toBeCalledWith sur ce point : const searchDishMock = jest.fn(); ... expect(searchDishMock).toBeCalledWith('BoB');

1 votes

Si wrapper.update(); ne fonctionne pas, vous pouvez également essayer wrapper.instance().forceUpdate();

14voto

Aleh Points 81

Doit être remplacé wrapper.update(); con wrapper.instance().forceUpdate();

0voto

Yusufali2205 Points 310

La réponse de @Miha a fonctionné avec un petit changement :

it('handleNameInput', () => {
  let wrapper = shallow(<MyComponent/>);
  const searchDishMock = jest.fn();
  wrapper.instance().searchDish = searchDishMock;
  wrapper.update();
  wrapper.instance().handleNameInput('BoB');
  expect(searchDishMock).toBeCalledWith('BoB');
})

4 votes

Cela fonctionne-t-il encore ? J'utilise React 16 et enzyme 3.3.0 mais le test ne passe pas. De plus, le document enzymatique ne semble pas suggérer que update peut enregistrer la fonction fantaisie.

1 votes

Tu n'as pas besoin de ça. wrapper.update() pour faire passer les tests.

1 votes

Quelqu'un sait-il comment faire cela avec React Test Library ?

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