当前位置: 首页 > 面试题库 >

Typescript和Jest:避免在模拟函数上键入错误

呼延才
2023-03-14
问题内容

当想用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中可以正常运行,但会引发Typescript错误:

类型’(url:string,config ?: AxiosRequestConfig | undefined)=>
AxiosPromise’不存在属性’mockReturnValueOnce’。

axios.get正确的typedef 不包含mockReturnValueOnce属性。我们可以axios.get通过将TypeScript
包装为来强制将Typescript 视为Object文字Object(axios.get),但是:

在保持类型安全的同时模仿函数的惯用方式是什么?


问题答案:

添加此行代码const mockedAxios = axios as jest.Mocked<typeof axios>。然后使用mockedAxios调用mockReturnValueOnce。使用您的代码,应该像这样完成:

import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';

jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

it('Calls the GET method as expected', async () => {
  const expectedResult: string = 'result';

  mockedAxios.get.mockReturnValueOnce({ data: expectedResult });
  const result = await myModuleThatCallsAxios.makeGetRequest();

  expect(mockedAxios.get).toHaveBeenCalled();
  expect(result).toBe(expectedResult);
});


 类似资料:
  • 我正在用TypeScript编写Jest测试,我想为如下函数创建一个强类型模拟: 请注意,回调是可选的。如果我用要强制转换模拟函数。。。 ...试着这样使用它: ... 我得到TS错误2345: 类型参数(选项:DownloadOptions,回调:(DownloadId: number)= 参数“callback”和“callback”的类型不兼容。 键入“((下载ID:编号)= 类型“未定义”

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。

  • 我想对我的服务进行单元测试。在我的服务中,我有一个构造函数,它是: ContractService.ts 我的模型看起来是这样的:(模型是来自sequelize-typescript的类) 所以我想用JEST创建我的单元测试。当我试图模仿contractModel时,它找不到方法,即使我试图模仿它。 我在想,怎样才是嘲弄这个合同模型的正确方法。

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。

  • 函数名称:模拟按下 home 键 函数功能: 点击一次 home 键 函数方法 keycode.home() 注意事项 部分设备可能会出现无效的问题,已知模拟器调用此命令可能会失效。 目前积木编程函数和触动精灵函数不通用,请仔细查看本手册,此手册中函数仅支持积木编程,不支持触动精灵,同理请勿将触动精灵函数在积木编程运行。

  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执