154 votes

comment changer la valeur de retour d'une fonction fantaisie dans chaque test ?

J'ai un module fantaisie comme celui-ci dans mon fichier de test de composants.

  jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => true,
    guidanceEnabled: () => true
  }));

ces fonctions seront appelées dans la fonction de rendu de mon composant pour masquer et afficher certaines caractéristiques spécifiques.

Je veux prendre un instantané sur différentes combinaisons de la valeur de retour de ces fonctions fantaisie.

Supposons que j'ai un cas de test comme celui-ci

 it('RowListItem should not render navigation and guidance options', () => {
    const wrapper = shallow(
      <RowListItem type="regularList" {...props} />
    );
    expect(enzymeToJson(wrapper)).toMatchSnapshot();
  });

pour exécuter ce cas de test, je veux changer les valeurs de retour des fonctions du module fantaisie en false comme ceci dynamiquement

jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => false,
    guidanceEnabled: () => false
  }));

parce que j'importe RowListItem le composant a déjà été importé une fois, donc mon module fantaisie ne sera pas réimporté. il ne changera donc pas. comment puis-je résoudre ce problème ?

210voto

Andreas Köberle Points 16453

Vous pouvez simuler le module pour qu'il renvoie des espions et l'importer dans votre test :

import {navigationEnabled, guidanceEnabled} from '../../../magic/index'

jest.mock('../../../magic/index', () => ({
    navigationEnabled: jest.fn(),
    guidanceEnabled: jest.fn()
}));

Plus tard, vous pourrez modifier l'implémentation réelle en utilisant la fonction mockImplementation

navigationEnabled.mockImplementation(()=> true)
//or
navigationEnabled.mockReturnValueOnce(true);

et dans le test suivant

navigationEnabled.mockImplementation(()=> false)
//or
navigationEnabled.mockReturnValueOnce(false);

5 votes

Peut-être que ce n'était pas le cas à l'époque, mais jest.mock doit être appelé avant de procéder à l'importation.

7 votes

@Sylvain Rien ne peut/ne sera appelé avant les imports ES6, ils sont statiquement forcés d'être les premiers.

3 votes

@OlaoyeOluwapelumi Vous pouvez le taper avant tout ce que vous voulez, mais il ne sera exécuté qu'après les importations ES6, car elles sont statiquement forcées d'être traitées en premier.

53voto

Dayan Moreno Leon Points 4181

Ce que vous voulez faire c'est

import { navigationEnabled, guidanceEnabled } from '../../../magic/index';   

jest.mock('../../../magic/index', () => ({
  navigationEnabled: jest.fn(),
  guidanceEnabled: jest.fn()
}));

describe('test suite', () => {
  it('every test', () => {
    navigationEnabled.mockReturnValueOnce(value);
    guidanceEnabled.mockReturnValueOnce(value);
  });
});

Pour en savoir plus sur ces fonctions, cliquez ici => https://facebook.github.io/jest/docs/mock-functions.html#mock-return-values

17 votes

Ceci ne fonctionne pas avec les typescript, vous obtiendrez : La propriété 'mockReturnValueOnce' n'existe pas sur le type '() => string'.

38 votes

Pour TS vous devez faire (mockedFn as jest.Mock). mockReturnValueOnce

5 votes

Si vous utilisez ts-jest le mocked(mockedFn) wrapper est un sucre syntaxique pour la même chose. github.com/kulshekhar/ts-jest/blob/master/docs/user/

11voto

Cass Points 422

J'ai eu du mal à faire fonctionner les réponses acceptées - mes équivalents de navigationEnabled y guidanceEnabled étaient indéfinis lorsque j'ai essayé d'appeler mockReturnValueOnce sur eux.

Voilà ce que je devais faire :

En ../../../magic/__mocks__/index.js :

export const navigationEnabled = jest.fn();
export const guidanceEnabled = jest.fn();

dans mon index.test.js fichier :

jest.mock('../../../magic/index');
import { navigationEnabled, guidanceEnabled } from '../../../magic/index';
import { functionThatReturnsValueOfNavigationEnabled } from 'moduleToTest';

it('is able to mock', () => {
  navigationEnabled.mockReturnValueOnce(true);
  guidanceEnabled.mockReturnValueOnce(true);
  expect(functionThatReturnsValueOfNavigationEnabled()).toBe(true);
});

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