Mock Service Worker无法拦截请求:自定义fetch响应未生效?
问题原因及解决方案
问题根源
你手动定义的极简fetch polyfill覆盖了MSW的请求拦截逻辑。
MSW的核心原理是通过**替换全局fetch(以及XMLHttpRequest等网络API)**来拦截请求,返回预设的mock响应。但你的setup-jest.js里提前给global.fetch赋值了固定返回空对象的实现,这个操作在MSW的server.listen()之前执行(setupFilesAfterEnv是Jest在测试框架初始化后、测试文件执行前运行的),导致MSW无法替换掉你自定义的fetch,请求自然不会走到MSW的mock handler,直接返回了你写的空对象。
另外你写的polyfill极其简陋,连response.json()这类必备方法都没有,就算后续拦截成功,代码也会报错。
解决方案
放弃手动写极简polyfill,改用标准的fetch polyfill,让MSW能正常拦截:
- 安装标准polyfill(比如
whatwg-fetch):
npm install whatwg-fetch --save-dev
- 修改
setup-jest.js,替换为导入标准polyfill:
import 'whatwg-fetch';
(移除原来的global.fetch = () => Promise.resolve({});)
- 重新运行测试,此时MSW会正常替换全局
fetch,你的请求会被拦截并返回预设的{val: true}。
补充说明
如果你的Node.js版本足够新(v18+),Node本身已经内置了fetch,完全不需要额外polyfill,直接删掉setup-jest.js里的polyfill代码即可。
内容的提问来源于stack exchange,提问作者elzoy
相关产品推荐
相关产品推荐

