测试跨域网络模块应绕过浏览器同源策略,核心是用 mock(如 jest-fetch-mock 或 msw)拦截请求、控制响应;或封装可注入的 HTTP 客户端以精准断言;必要时启动本地 CORS 服务验证真实跨域行为,但单元测试优先 mock。

测试依赖跨域请求的网络通信模块,核心是绕过浏览器同源策略对真实请求的拦截,同时保证测试逻辑覆盖请求发起、响应处理、错误路径等关键环节。不能直接在浏览器环境发真实跨域请求做单元测试(会触发 CORS 预检失败或被拒绝),而应通过模拟(mock)或可控服务来隔离网络不确定性。
用 Mock 工具拦截 fetch / XMLHttpRequest
这是最常用、最轻量的方式。借助 jest(配合 jest-fetch-mock)或 msw(Mock Service Worker) 拦截全局网络调用,返回预设响应。
- 使用 jest-fetch-mock:启用后可 mock
fetch,控制状态码、headers、body;适合单元测试,不依赖真实服务 - 使用 msw:在浏览器或 Node(配合
node-request-interceptor)中拦截请求,支持真实 HTTP 方法、URL 匹配、延迟、多次响应等;更适合集成/端到端风格的通信逻辑验证 - 注意:若模块内部用
XMLHttpRequest,需单独 mock 它(jest中可用jest.mock('xmlhttprequest', ...)),或统一封装为 fetch 再 mock
封装网络层并注入可替换的客户端
避免模块硬编码 fetch 或 axios,改为接受一个“HTTP 客户端”作为参数或通过依赖注入获取。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 例如导出函数时支持传入
client:function request(url, options, client = fetch) { return client(url, options); } - 测试时传入 mock 函数,完全掌控输入输出,无需修改全局行为,更易断言调用参数(如 headers 是否含 token、body 是否序列化正确)
- 适用于需要深度验证请求构造逻辑(如鉴权头、query 拼接、重试策略)的场景
启动本地跨域兼容测试服务(慎用)
仅在必要时(如测试真实 CORS 行为、预检请求、credentials 处理)启动一个带 CORS 头的本地服务(如 Express + cors() 中间件)。
- 服务返回固定 JSON,允许任意源、支持 credentials、暴露自定义 header
- 测试用例中用真实
fetch请求该本地地址(如http://localhost:3001/api/data) - 缺点:增加环境依赖、测试变慢、可能受网络或端口冲突影响;建议仅用于 E2E 或专项 CORS 验证,而非日常单元测试
覆盖典型边界情况
无论用哪种方式,测试必须包含:
- 成功响应(200,JSON body 解析正常)
- 非 2xx 状态码(401、404、500)是否触发对应错误分支
- 网络异常(fetch 抛错、AbortError)是否被正确捕获和透出
- 超时逻辑(如果模块实现 timeout)是否如期中断请求
- 跨域敏感字段(如
withCredentials: true)在 mock 中是否被正确传递和校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










