如何模拟获取响应对象

How to mock fetch Response object

我试图用 ts-jest 模拟获取响应,但我 运行 进入打字稿错误

import { mocked } from 'ts-jest/utils';
import fetch from 'node-fetch';

import { getInstallationAccessToken } from './index';

const mockedFetch = mocked(fetch, true);

describe('getInstallationAccessToken', () => {
  const TODAY = new Date();
  const TOMORROW = new Date();
  TOMORROW.setDate(TODAY.getDate() + 1);

  beforeEach(() => {
    mockedFetch.mockResolvedValue({
      status: 200,
      json: async () => ({
        token: 'MOCKED_GITHUB_INSTALLATION_ACCESS_TOKEN',
        expires_at: TOMORROW.toISOString()
      })
    });
    jest.clearAllMocks();
  });

  test('generates github app jwt token', async () => {
    await getInstallationAccessToken();
    expect(mockedJwt.sign).toBeCalledTimes(1);
  });
})

在这个例子中,我收到以下错误:

Argument of type '{ status: number; json: () => Promise<{ token: string; expires_at: string; }>; }' is not assignable to parameter of type 'Promise<Response> | PromiseLike<Promise<Response>>'.
  Object literal may only specify known properties, and 'status' does not exist in type 'Promise<Response> | PromiseLike<Promise<Response>>'.ts(2345)

所以我试图构建一个合适的 Response 对象:

    const response = new Response(JSON.stringify({
      token: 'MOCKED_GITHUB_INSTALLATION_ACCESS_TOKEN',
      expires_at: TOMORROW.toISOString()
    }),  { status: 200 })


    mockedFetch.mockReturnValue(Promise.resolve(response));

但是现在,.json 方法没有在响应对象上定义

TypeError: response.json is not a function

      56 |     });
      57 |
    > 58 |     const json = await response.json();
         |                                 ^
      59 |
      60 |     if (response.status >= 300) {
      61 |       throw new Error(

关于如何解决这个问题的任何想法?

我认为您可以再次尝试使用您的第一个模拟并将您的模拟对象转换为 Response 将按以下方式工作:


import fetch, { Response } from 'node-fetch';


mockedFetch.mockResolvedValue({
  status: 200,
  json: async () => ({
    token: 'MOCKED_GITHUB_INSTALLATION_ACCESS_TOKEN',
    expires_at: TOMORROW.toISOString()
  })
} as Response); // cast to Response type since we just mock what we need to