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

Я тестирую свой GraphQL api с помощью Jest.

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

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

  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.info(result);

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

    // test resolvers
  });

Когда я console.info(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 работает нормально ...

Похоже, ваш макет возвращение - объект ошибки, а не бросание. Не видя вашего кода, который вы тестируете, я могу поделиться только тем опытом, который у меня был. Я забыл издеваться над функцией, вызванной в моей мутации, что привело к непреднамеренной выдаче ошибки. Возможно, с вами происходит что-то подобное?

Rhuarc13 14.05.2018 15:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
92
1
87 225
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Замените .mockReturnValue на .mockImplementation:

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

Если это обещание, вы также можете .rejectsjestjs.io/docs/en/asynchronous#resolves--rejects

eduardomoroni 30.12.2019 13:57

здорово. Как с этим справиться, сделать и отстоять?

Kryshtop 20.02.2021 00:00

Для Angular + Jest:

import { throwError } from 'rxjs';

yourMockInstance.mockImplementation(() => {
  return throwError(new Error('my error message'));
});

Технически это не throw в чистом смысле JS. Вы настраиваете макет так, чтобы он возвращал наблюдаемый объект RXJS, который немедленно выдает уведомление об ошибке. Тем не менее, это может быть полезно для людей здесь. Принятый ответ, безусловно, будут создает фиктивную ошибку. Во всех случаях.

Zach Lysobey 16.09.2020 23:57

Достаточно только возврата throw Error: yourMockInstance.mockImplementation(() => throwError('my error message'));

manzapanza 30.04.2021 23:42

Другие вопросы по теме