Я пишу некоторые модульные тесты и мне нужно смоделировать именованный экспорт из файла, но, похоже, он не работает, когда экспорт - это функция, которая возвращает обещание.
Например, яу меня есть модуль, расположенный в 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); }