使用fetch-mock-jest 1.5.1无法mock fetch请求的问题求助
问题原因
- 劫持对象不匹配:fetch-mock-jest默认只会劫持全局作用域下的
fetch,你使用的backstage配置加载逻辑内部大概率是单独引入了node-fetch依赖,而非调用全局fetch,导致mock完全没有生效,请求直接走了真实网络。 - 环境缺少全局fetch:Node.js 17及以下版本默认没有内置全局
fetch对象,fetch-mock找不到劫持目标,也会导致真实请求被发出。 - 匹配规则不精准:当前你使用通配符
*作为匹配规则,若请求携带特殊method、header也可能出现匹配失败,fetch-mock会默认放行请求到真实网络。
解决方案
方案1:直接mock node-fetch 依赖(最稳妥)
直接劫持loadConfig依赖的node-fetch包,不需要额外引入fetch-mock-jest:
// 测试文件顶部添加mock逻辑 jest.mock('node-fetch', () => jest.fn()); import fetch from 'node-fetch'; // 替换原来的beforeEach逻辑 beforeEach(() => { jest.clearAllMocks(); (fetch as jest.Mock).mockResolvedValue({ ok: true, headers: { get: (headerName: string) => headerName === 'etag' ? 'test-etag' : undefined }, text: () => Promise.resolve(`app: title: Example App sessionKey: 'abc123' `) }); }); // 断言部分调整为校验fetch调用次数 expect(fetch).toHaveBeenCalledTimes(1);
方案2:显式绑定fetch实例到fetch-mock
如果要继续使用fetch-mock-jest,需要手动指定要劫持的fetch实例:
import fetch from 'node-fetch'; import fetchMock from 'fetch-mock-jest'; // 绑定到实际使用的fetch实例 fetchMock.mockImplementation(fetch); // 调整mock规则为精准匹配,避免匹配失败 beforeEach(() => { fetchMock.mock('https://some.domain.io/app-config.yaml', { body: `app: title: Example App sessionKey: 'abc123' `, headers: { 'ETag': 'test-etag' } }); });
方案3:补充全局fetch polyfill
如果是Node版本过低导致没有全局fetch,在测试文件顶部添加全局挂载逻辑:
import fetch from 'node-fetch'; global.fetch = fetch;
内容的提问来源于stack exchange,提问作者Matto
相关产品推荐
相关产品推荐

