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

Node.js 18内置Fetch测试中Undici Mock无法拦截请求

Node.js 18内置Fetch结合Undici Mock拦截请求失败的解决办法

你的代码存在几个关键问题,导致Undici无法正确拦截请求,以下是具体修正方案:

问题分析与关键改动

  1. MockAgent.get()参数错误:Undici的MockAgent.get()要求传入主机名(如www.google.com),而非带协议的完整URL。传入http://www.google.com会导致请求匹配失败,直接走真实网络。
  2. 配置顺序影响生效:需先禁用真实网络连接,再激活agent并设置全局调度器,确保所有请求被MockAgent接管。
  3. 响应断言方式错误:内置Fetch返回的是Response对象,不能直接与JSON对象对比,需解析响应体后再断言。

修正后的测试代码

const { MockAgent, setGlobalDispatcher } = require('undici');

test('should respond with body passed in', async () => {
  const opts = { method: 'GET' };
  const body = { statusInfo: { status: 'SUCCESS' }};

  const agent = new MockAgent({ connections: 1 });
  // 仅传入主机名,移除http://前缀
  const mockPool = agent.get('www.google.com');
  mockPool.intercept({
    path: '/test'
  }).reply(200, body);
  
  // 先禁用真实网络连接,再激活agent
  agent.disableNetConnect();
  agent.activate();
  setGlobalDispatcher(agent);

  const result = await fetch('http://www.google.com/test', opts);
  const responseBody = await result.json(); // 解析响应体为JSON

  expect(responseBody).toEqual(body);
});

额外注意事项

  • 确保Undici版本为最新,旧版本可能存在与Node.js 18内置Fetch的兼容问题
  • 若使用Jest等测试框架,检查是否有其他代码修改了全局Fetch或调度器,导致拦截失效

内容的提问来源于stack exchange,提问作者jmillman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:15:26