Как смоделировать функцию, которая вызывается в "then" в axios обещании? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть функция, которая извлекает данные из бэкэнда.Когда выборка успешна, она извлекает одно значение из ответа, а затем вызывает другую функцию (parseAllRecordsData), которая преобразует значение в другое значение.Я пытаюсь протестировать эту функцию, но после насмешки над функцией parseAllRecordsData она все еще пытается вызвать оригинальную функцию (и выдает ошибки из этой функции).

В других тестах jest.fn или jest.spy работают правильно, но когда я пытаюсь смоделировать функцию, которая используется в «then», это не так.

export function fetchAllRecordsData(payload) {
    const url = `/apis/${payload.link.split('apis/')[1]}`;
    return axios.get(url)
        .then(({ data }) => {
            if (data && data._embedded) {
                const parsedData = data._embedded['taxonomies:entry'];
                const arrayData = parseAllRecordsData(parsedData, payload);
                return { data: List(arrayData) };
            }
            return { data: List([]) };
        })
        .catch((error) => ({ error }));
}

И мой тест:

describe('fetchAllRecordsData', () => {
    const mockedPayload = {
        link: 'apis/ok_link',
    };

    beforeAll(() => {
        jest.spyOn(LegalListRecordsApi,'parseAllRecordsData').mockReturnValue(['test']);
    });

    it('test', async () => {
        const test = await LegalListRecordsApi.fetchAllRecordsData(mockedPayload);
        expect(test).toEqual(1);
    });
});

Когда он вызывается так, parseAllRecordsData вызывает реальную функцию и выдает ошибку, потому что у поддельного ответа Axios нет некоторых значений, которые анализируютсяиспользование функции.Меня интересует только возвращаемое значение, а не вызов этой функции.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

jest.spyOn(LegalListRecordsApi,'parseAllRecordsData').mockReturnValue(['test']); макетирует экспорт модуля для parseAllRecordsData.

Это не влияет на fetchAllRecordsData, поскольку он находится в том же модуле, что и parseAllRecordsData, и вызывает его напрямую .

Модули ES6 поддерживает циклические зависимости , поэтому вы можете импортировать модуль в себя.

Импортировать модуль в себя и использоватьмодуль для вызова parseAllRecordsData:

import * as LegalListRecordsApi from './LegalListRecordsApi';  // import module into itself

export function fetchAllRecordsData(payload) {
  const url = `/apis/${payload.link.split('apis/')[1]}`;
  return axios.get(url)
    .then(({ data }) => {
      if (data && data._embedded) {
        const parsedData = data._embedded['taxonomies:entry'];
        const arrayData = LegalListRecordsApi.parseAllRecordsData(parsedData, payload);  // use the module
        return { data: List(arrayData) };
      }
      return { data: List([]) };
    })
    .catch((error) => ({ error }));
}

... и вызов будет посмеянным, когда вы смоделируете экспорт модуля для parseAllRecordsData.

0 голосов
/ 06 февраля 2019
export function fetchAllRecordsData(payload, axiosInterface = axios) {
  return return axiosInterface.get(url)
   . then(({ data }) => {
      // your code
    })
   .catch((error) => ({ error }))
}

Итак, вам нужно создать фиктивный объект с помощью метода get, метод get должен вернуть обещание.

...