我正在编写一些单元测试,需要从文件中模拟命名的导出,但是当导出是一个返回promise的函数时,它似乎不起作用。
例如,我有一个位于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
,好像在模拟模块工厂中使用的开玩笑的功能没有返回承诺。如果
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); }
最佳答案
首先,您需要在导入之前模拟它:
jest.mock('lib/api');
import * as api from 'lib/api';
关于javascript - 在笑话模拟模块工厂中模拟 promise ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58192814/