在Typescript中正确模拟提取

4jb9z9bj  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(149)

我有一个关于这个代码的问题:

import useCountry from './useCountry';
import { renderHook } from '@testing-library/react-hooks';
import { enableFetchMocks } from 'jest-fetch-mock';
enableFetchMocks();

it('should make proper api call', async () => {
  const resultCountries = {
    PL: 'Poland',
    CA: 'Canada',
  };

  jest.spyOn(global, 'fetch').mockImplementation(() =>
    Promise.resolve({
      json: () => Promise.resolve(resultCountries),
    } as Response),
  );

  const expected = [
    { code: 'PL', name: 'Poland' },
    { code: 'CA', name: 'Canada' },
  ];

  const { result, waitForNextUpdate } = renderHook(() => useCountry());
  await waitForNextUpdate();

  expect(fetch).toHaveBeenCalled();
  expect(result.current).toEqual(expected);
});

删除as Response时,我收到此Typescript警告:
TS2345:类型"()=〉Promise〈{json:()=〉承诺〈{PL:字符串; CA:字符串;}〉;}〉'不能赋值给类型'的参数(输入?:弦|请求|未定义,姓名首字母缩写?:请求初始化|未定义)=〉承诺'。 键入"承诺〈{json:()=〉承诺〈{PL:字符串; CA:字符串;}〉;"}〉"不能赋给类型" Promise "。 键入"{json:()=〉承诺〈{PL:字符串; CA:字符串;}〉;"}"缺少类型" Response "的以下属性:报头、ok、redirected、status以及其他11个。
我想问一下如何正确地模拟fetch,因为这个as Response感觉像是一个糟糕的实践。

cqoc49vn

cqoc49vn1#

我在模拟fetch函数时遇到了这个问题,只是在.test.tsx中添加了以下代码。

//app.test.tsx
global.fetch = jest.fn(async () =>
  Promise.resolve({ json: async () => Promise.resolve({ id: 0 }) })
) as jest.Mock;

相关问题