如何模拟获取响应对象

Mar*_*lik 5 response fetch typescript jestjs ts-jest

我尝试使用 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);
  });
})
Run Code Online (Sandbox Code Playgroud)

在此示例中,我收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

所以我尝试构造一个合适的Response对象:

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


    mockedFetch.mockReturnValue(Promise.resolve(response));
Run Code Online (Sandbox Code Playgroud)

但是现在,该.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(
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题有什么想法吗?

tmh*_*005 6

我认为您可以再次尝试第一个模拟并强制转换您的模拟对象,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

Run Code Online (Sandbox Code Playgroud)