web-dev-qa-db-fra.com

Comment bien faire semblant de lancer une erreur dans Jest?

Je teste mon API GraphQL en utilisant Jest.

J'utilise une combinaison de test séparée pour chaque requête/mutation

J'ai 2 tests (chacun dans une combinaison de test séparée) où je simule une fonction (à savoir, Meteor callMethod) utilisée dans les mutations.

  it('should throw error if email not found', async () => {
    callMethod
      .mockReturnValue(new Error('User not found [403]'))
      .mockName('callMethod');

    const query = FORGOT_PASSWORD_MUTATION;
    const params = { email: '[email protected]' };

    const result = await simulateQuery({ query, params });

    console.log(result);

    // test logic
    expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
      email: '[email protected]',
    });

    // test resolvers
  });

Quand j'ai console.log(result) je reçois

{ data: { forgotPassword: true } }

Ce comportement n’est pas ce que je veux car dans .mockReturnValue je génère une erreur et j’attends donc que result ait un objet error

Avant ce test, cependant, un autre est exécuté

 it('should throw an error if wrong credentials were provided', async () => {
    callMethod
      .mockReturnValue(new Error('cannot login'))
      .mockName('callMethod');

Et ça marche bien, l'erreur est levée

Je suppose que le problème est que la maquette ne se réinitialise pas une fois le test terminé. Dans mon jest.conf.js j'ai clearMocks: true

Chaque combinaison de test est dans un fichier séparé et je me moque des fonctions avant des tests comme celui-ci:

import simulateQuery from '../../../helpers/simulate-query';

import callMethod from '../../../../imports/api/users/functions/auth/helpers/call-accounts-method';

import LOGIN_WITH_PASSWORD_MUTATION from './mutations/login-with-password';

jest.mock(
  '../../../../imports/api/users/functions/auth/helpers/call-accounts-method'
);

describe('loginWithPassword mutation', function() {
...

UPDATE

Quand j'ai substitué .mockReturnValue avec .mockImplementation tout s'est passé comme prévu:

callMethod.mockImplementation(() => {
  throw new Error('User not found');
});

Mais cela n'explique pas pourquoi dans un autre test .mockReturnValue fonctionne bien ...

29
Le garcon

Changer .mockReturnValue avec .mockImplementation:

yourMockInstance.mockImplementation(() => {
  throw new Error();
});
46
eduardomoroni