208 votes

Comment faire correctement une simulation d'erreur dans Jest?

Je teste mon GraphQL de l'api à l'aide de la Plaisanterie.

Je suis en utilisant un test de costume pour chaque requête/mutation

J'ai 2 tests (chacun dans un essai séparé costume) où j'ai simulé une fonction (à savoir, de Meteor callMethod) qui est utilisé 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: 'user@example.com' };

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

    console.log(result);

    // test logic
    expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
      email: 'user@example.com',
    });

    // test resolvers
  });

Quand j' console.log(result) - je obtenir

{ data: { forgotPassword: true } }

Ce comportement n'est pas ce que je veux, parce que dans .mockReturnValue - je jeter une Erreur et, par conséquent, s'attendre à result d'avoir un objet d'erreur

Avant ce test, cependant, un autre est couru

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

Et il fonctionne très bien, l'erreur est levée

Je suppose que le problème est que la maquette n'est pas se réinitialiser après la fin du test. Dans mon jest.conf.js j'ai clearMocks: true

Chaque test du costume est dans un fichier séparé, et j'ai simulé des fonctions avant que des tests de ce genre:

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() {
...

Mise à JOUR

Lorsque j'ai remplacé .mockReturnValue avec .mockImplementation que tout a fonctionné comme prévu:

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

Mais cela n'explique pas pourquoi dans un autre test, .mockReturnValue fonctionne très bien...

356voto

eduardomoroni Points 359

Changer .mockReturnValue avec .mockImplementation :

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

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