Node.js 18内置Fetch测试中Undici Mock无法拦截请求
Node.js 18内置Fetch结合Undici Mock拦截请求失败的解决办法
你的代码存在几个关键问题,导致Undici无法正确拦截请求,以下是具体修正方案:
问题分析与关键改动
- MockAgent.get()参数错误:Undici的
MockAgent.get()要求传入主机名(如www.google.com),而非带协议的完整URL。传入http://www.google.com会导致请求匹配失败,直接走真实网络。 - 配置顺序影响生效:需先禁用真实网络连接,再激活agent并设置全局调度器,确保所有请求被MockAgent接管。
- 响应断言方式错误:内置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
相关产品推荐
相关产品推荐

