издеваться над обещанием в шутку макет модуля фабрики - PullRequest
1 голос
/ 02 октября 2019

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

Например, яу меня есть модуль, расположенный в lib/api.js, который экспортирует одну функцию с именем getFoo, которая сама возвращает axios.get ('/ foo').

В моих тестах я хочу смоделировать возвращаемое значение getFoo должно быть решенным обещанием с полезной нагрузкой foo, поэтому я издеваюсь, используя фабрику модулей:

import * as api from 'lib/api';
jest.mock('lib/api', () => ({
  getFoo: jest.fn(() => Promise.resolve('foo')),
});

и затем в своем тесте я хочу утверждать, что getFoo был вызван как часть более крупного процесса связанных обещаний.

it('getBar should call getFoo', () => {
  return getBar().then(() => {
    expect(api.getFoo).toHaveBeenCalled();
  });
})

Я получаю здесь ошибку cannot read property 'then' of undefined, как будто функция jest, используемая на фабрике проверенных модулей, не возвращает обещание.

Если возвращаемое значение для getFoo не обещание, оно работает, как и ожидалось. Если я использую jest.fn() в качестве значения для getFoo, а затем в самом тесте высмеиваю реализацию ...

it('getBar should call getFoo', () => {
  api.getFoo.mockImplementation(() => Promise.resolve("foo"));
  return getBar().then(() => {
    expect(api.getFoo).toHaveBeenCalled();
  });
})

... тогда это работает. Насколько я понимаю, jest.fn (() => {}) должен быть просто более коротким способом определения реализации, поэтому я не уверен, почему я получаю ошибку. Любая помощь приветствуется.

Спасибо.

Подробнее:

* lib/api выглядит следующим образом ...

import axios from 'axios';

export const getFoo = (host: string, accessToken: string): Promise<{}> =>
  axios.get(`${host}/foo`, {
    headers: {
      Authorization: `Bearer ${accessToken}`,
      'Content-Type': 'application/json',
    }
  })
  // return foo
  .then((response) => response.data)
  .catch(() => {
    throw new Error('Failed to load foo');
  });

Когда я консольный журналпроверенная функция getFoo во время выполнения теста отображается как ...

getFoo function mockConstructor() {
  return fn.apply(this, arguments);                                                                         }

1 Ответ

0 голосов
/ 02 октября 2019

Прежде всего, вам нужно смоделировать его перед импортом:

jest.mock('lib/api');

import * as api from 'lib/api';
...