You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fetch-mock-jest 1.5.1无法mock fetch请求的问题求助

问题原因

  1. 劫持对象不匹配:fetch-mock-jest默认只会劫持全局作用域下的fetch,你使用的backstage配置加载逻辑内部大概率是单独引入了node-fetch依赖,而非调用全局fetch,导致mock完全没有生效,请求直接走了真实网络。
  2. 环境缺少全局fetch:Node.js 17及以下版本默认没有内置全局fetch对象,fetch-mock找不到劫持目标,也会导致真实请求被发出。
  3. 匹配规则不精准:当前你使用通配符*作为匹配规则,若请求携带特殊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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:48:01