it-swarm.com.ru

Почему эти шутки не сбрасываются?

У меня есть тестовый код, который влияет на другие тесты и вызывает их сбой. Когда я запускаю тестовые случаи изолированно, все проходит, но когда я запускаю весь костюм, возникает много сбоев. Если вы посмотрите на оба теста ниже, вы увидите, что я переопределил макетированный модуль в тесте, чтобы вызвать исключение. 

HttpService.post = jest.fn(() => {
   return Promise.reject({ payload: 'rejected' });
});

после запуска этой строки все тесты, для которых требуется исходный макет HttpService.post, не пройдены, поскольку они не сбрасываются. Как я могу правильно восстановить мой макет в импортированном макете после этого теста? Я пробовал jest.resetMock в beforeEach и о каждом подобном шутливом методе, но ничего не получалось. Я знаю, что ответ, вероятно, прямой, но меня смущают все разногласия, которые я читал в Интернете о том, как импортируется код (es6 import, commonJs). Спасибо!

import HttpService from '../../services/httpService';
import handleErrors from '../../utilities/handleErrors';

jest.mock('../../services/httpService');
jest.mock('../../utilities/handleErrors');

describe('async actions', () => {

  beforeEach(() => {
    store = mockStore({});
  });

  describe('some describe that wraps both tests', () => {

    describe('a describe that wraps just the first test', () => {
      test(`creates ${constants.actions.REQUEST_SAVE_NOTE_FAILURE}`, () => {
        HttpService.post = jest.fn(() => {
          return Promise.reject({ payload: 'rejected' });
        });
        const expectedActions = [
          { type: constants.actions.REQUEST_SAVE_NOTE },
          { type: constants.actions.REQUEST_SAVE_NOTE_FAILURE, data: { payload: 'rejected' } },
        ];
        return store.dispatch(actions.saveNote({
          id: 1,
          note: 'note',
        })).then(() => {
          expect(store.getActions()).toEqual(expectedActions);
        });
      });
    });

    describe('a describe that wraps just the second test', () => {
      test(`creates ${constants.actions.REQUEST_SAVE_NOTE}
        and ${constants.actions.RECEIVE_SAVE_NOTE}`, () => {
        params = {
          body: {
            prospects: [1],
            note: 'note',
          },
        };
        const expectedActions = [
          { type: constants.actions.REQUEST_SAVE_NOTE },
          { type: constants.actions.RECEIVE_SAVE_NOTE, data: { payload: 'payload' } },
        ];

        return store.dispatch(actions.saveNote({
          id: 1,
          note: 'note',
        })).then(() => {
          expect(store.getActions()).toEqual(expectedActions);
          expect(HttpService.post).toBeCalledWith({ ...params, url: '/api/prospect/add-note' });
        });
      });
    });

  })

});
7
withintheruins14

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

import HttpService from '../../services/httpService';
jest.mock('../../services/httpService', ()=>({
  post: jest.fn()
});

позже вы можете установить поведение макета, как это

HttpService.post.mockImplementation(()=>Promise.reject({ payload: 'rejected' }))

и сбросить

HttpService.post.mockReset()
7
Andreas Köberle

У меня была похожая проблема. Оказалось, что это https://github.com/facebook/jest/pull/5720 было проблемой, и обновление Jest по крайней мере до версии 23.0.0 решило проблему. На момент написания статьи 23.6 является последней стабильной версией Jest.

В моем случае mockRejectedValueOnce, по-видимому, не сбрасывался, потому что, когда я закомментировал методы mockRejectedValueOnce в предыдущих тестах, мой более поздний тест (рассматриваемый тест) снова работал. Таким образом, метод сброса не был эффективным.

1
Rock Lee