Как правильно сделать ложную ошибку в Jest?

Я тестирую свой GraphQL api, используя Jest.

Я использую отдельный тест для каждого запроса/мутации

У меня есть 2 теста (каждый в отдельном тестовом костюме), где я макет одной функции (а именно Meteor callMethod), которая используется в мутациях.

  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
  });

Когда я console.log(result) получаю

{ data: { forgotPassword: true } }

Это поведение не то, что я хочу, потому что в .mockReturnValue я бросаю ошибку и поэтому ожидаю, что result будет иметь объект ошибки

Однако перед этим тестом

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

И он отлично работает, ошибка бросается

Я думаю, проблема в том, что макет не сбрасывается после завершения теста. В моем jest.conf.js меня есть clearMocks: true

Каждый тестовый костюм находится в отдельном файле, и я издеваюсь над функциями перед такими испытаниями:

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

ОБНОВИТЬ

Когда я заменил .mockReturnValue с .mockImplementation все получилось как ожидалось:

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

Но это не объясняет, почему в другом тесте .mockReturnValue отлично работает...

Ответы

Ответ 1

Изменить .mockReturnValue с .mockImplementation:

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