当希望使用 Jest 模拟外部模块时,我们可以使用 jest.mock()
方法自动模拟模块上的函数。
然后,我们可以随心所欲地操作和询问模拟模块上的模拟函数。
例如,考虑下面这个模仿 axios 模块的人为例子:
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 中运行良好,但会抛出一个类型错误:
类型不存在的属性’仿回值一次’(url: 字符串,配置? : AxiosRequestConfig | 未定义) = > Axios 。
axios.get
的 typedef 正确地不包括 mockReturnValueOnce
属性。我们可以通过将其包装为 Object(axios.get)
来强制 Typecript 将 axios.get
作为 Object 文本处理,但是:
在维护类型安全的同时模拟函数的惯用方法是什么?