如何模拟获取响应对象
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
我试图用 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