当想用 Jest 模拟外部module时,我们可以使用该jest.mock()
方法在module上自动模拟功能。
然后,我们可以根据需要在模拟module上操作和询问模拟函数。
例如,考虑以下模拟 axios module的人为示例:
import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';
jest.mock('axios');
it('Calls the GET method as expected', async () => {
const expectedResult: string = 'result';
axios.get.mockReturnValueOnce({ data: expectedResult });
const result = await myModuleThatCallsAxios.makeGetRequest();
expect(axios.get).toHaveBeenCalled();
expect(result).toBe(expectedResult);
});
上面的代码在 Jest 中运行良好,但会抛出 Typescript 错误:
属性 'mockReturnValueOnce' 在类型 '(url: string, config?: AxiosRequestConfig | undefined) => AxiosPromise' 上不存在。
rightly 的 typedefaxios.get
不包含mockReturnValueOnce
属性。我们可以axios.get
通过将Typescript包装为来强制 Typescript 将其视为对象文字Object(axios.get)
,但是:
在保持类型安全的同时模拟函数的惯用方法是什么?