web-dev-qa-db-fra.com

Se moquer d'une fonction d'un autre fichier - Jest

J'écris des cas de tests unitaires pour ma demande. Il y a une fonction qui est écrite dans la section Utils et utilisée dans tous les fichiers. Je voulais me moquer de cette fonction Utils chaque fois que j'en ai besoin mais je ne suis pas en mesure de le faire.

Voici ma configuration de code:

Utils.js

> const getData = (name) => "Hello !!! " + name;
> 
> const getContact = ()=> return Contacts.mobile;
> 
> export {
>     getData,
>     getContact }

Login.js (qui utilise Utils.js)

    const welcomeMessage = (name) => {

    return getData(name);
    }

Mon fichier de test (Login.spec.js)

import { getData } from '../../src/utils';


jest.mock('getData', () => jest.fn())


describe('User actions', () => {

    it('should get username', () => {
        const value = 'Hello !!! Jest';
        expect(welcomeMessage('Jest')).toEqual(value);
    });

});

Lorsque j'exécute mon scénario de test, j'obtiens cette erreur:

 Cannot find module 'getData' from 'Login.spec.js'

J'ai essayé de trouver la solution sur la documentation officielle de Jest et sur SO également mais je n'ai rien trouvé. Je ne peux pas corriger cette erreur et me moquer de cette fonction.

7
Dalvik

Le premier argument de jest.mock(...) doit être un chemin de module:

jest.mock('../../src/utils');

parce que le module utils est votre code, pas une 3ème lib, vous devez donc apprendre une maquette manuelle de plaisanterie: https://facebook.github.io/jest/docs/en/manual-mocks .html

si vous aviez ce fichier: src/utils.js

vous pouvez vous en moquer en créant un fichier: src/__mocks__/utils.js

le contenu de ce fichier est la réplication de l'original mais remplacez l'implémentation par getData = jest.fn()

sur votre fichier de test, appelez simplement: jest.mock('../../src/utils'); au début du fichier.

puis quand vous êtes familier avec, vous pouvez appeler cette fonction à l'intérieur de beforeEach() et appeler son compteur jest.unmock('../../src/utils'); initié afterEach()

Un moyen simple d'y penser est que:

lorsque vous appelez jest.mock('../../src/utils');, cela signifie que vous dites à jest que:

hé si le test en cours répond à la ligne require('../../src/utils'), ne le chargez pas, laissez charger ../../src/__mocks__/utils.

16
Khoa

une autre solution pourrait tromper cela en faisant quelque chose comme:

window['getData'] = jest.fn();
1
Dan