测试报错"ReferenceError: fetch is not defined",已安装node-fetch未导入
问题解决:fetch未定义导致测试失败
已安装node-fetch包,但当前代码未导入该包就直接使用fetch,导致fetch未定义,进而引发测试失败。其他文件未导入却能正常运行,大概率是环境差异导致——比如其他代码运行在浏览器环境(浏览器原生支持fetch),而当前是Next.js API路由,运行在Node.js环境(Node本身不自带fetch)。
修复步骤
1. 在API路由文件中导入node-fetch
根据你安装的node-fetch版本,选择对应导入方式:
- v2版本或v3+版本(ES模块):
import fetch from 'node-fetch';
修改后的完整代码:
import { IQuery } from 'models/IQuery.interface'; import { NextApiRequest, NextApiResponse } from 'next'; import { handleProxyResponse } from 'utils/handleProxyResponse.util'; import { appendApiRoute, getDefaultHeaders, getLocale } from 'utils/proxy.util'; import fetch from 'node-fetch'; // 新增导入 export const getContentPage = async (locale: string, publicId: string) => { const headers = getDefaultHeaders(); // fetch已定义,同时补上await确保拿到响应对象 const response = await fetch(appendApiRoute(`static-content/v1/${locale}/pages/${publicId}`), { method: 'GET', headers }); return response; }; export default async (request: NextApiRequest, response: NextApiResponse) => { const currentLocale = getLocale(request); const { query } = request; const { slug } = query as IQuery; const result = await getContentPage(currentLocale, slug); return handleProxyResponse(result, response); };
注意:原代码中
fetch调用缺少await,会直接返回Promise对象,补上await才能拿到实际响应,避免后续逻辑异常。
2. 修复测试用例
测试环境同样需要确保fetch可用,有两种处理方式:
方式一:直接导入node-fetch到测试文件
import fetch from 'node-fetch'; import contentProxy from '../path-to-your-api-file'; it('should return handledProxyResponse', async () => { const result = await contentProxy(defaultRequest, response); expect(result).toEqual(handleProxyResponseReturnValue); });
方式二:用Jest模拟fetch(推荐,避免发起真实请求)
import contentProxy from '../path-to-your-api-file'; import { handleProxyResponse } from 'utils/handleProxyResponse.util'; jest.mock('node-fetch'); jest.mock('utils/handleProxyResponse.util', () => ({ handleProxyResponse: jest.fn(() => 'mock-response') })); it('should return handledProxyResponse', async () => { const mockFetch = jest.requireMock('node-fetch'); mockFetch.mockResolvedValue({ ok: true }); // 模拟fetch成功响应 const result = await contentProxy(defaultRequest, response); expect(result).toEqual('mock-response'); expect(handleProxyResponse).toHaveBeenCalled(); });
内容的提问来源于stack exchange,提问作者tdimoff
相关产品推荐
相关产品推荐

