Nock HTTP 模拟库
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/nock-http-server-mocking-nodejs
技能介绍
要解决什么问题
Node.js 生态里发起 HTTP 请求几乎零成本,http.request、axios、got 都可以随手调用。可一到测试阶段,打真实服务就会暴露一堆问题:外部接口响应慢、行为漂移、偶发限流甚至计费,都会让测试结果变得不可复现。你需要一层能挡在请求离开进程之前的拦截机制。
它是怎么工作的
Nock 的实现思路非常直接:替换 Node 核心模块里的 http.request,同时覆盖 http.ClientRequest,这样即使某些库直接走底层 API 也拦得住。拦截发生在网络层之前,请求根本没有真实发出。
- 你先用
nock('https://api.example.com')声明要拦截的 host - 用
.get('/users/1')匹配具体方法和路径,也支持正则、查询参数等模式 - 用
.reply(200, payload)返回预设的状态码和响应体 - 用
.replyWithError()模拟超时、断网等失败场景
在测试文件里注册好期望后,任何指向该 host 的请求都会被替换成你写好的响应,测试结束再通过 nock.cleanAll() 清理。
适用边界与注意点
- 只拦 Node 进程内的出站请求,浏览器或其他语言发起的请求管不了
- 拦截的是
http.request这一层,所以基于它的封装库(axios、got等)都能生效,但完全绕过该层的库要单独验证 - 官方明确支持 Node.js,不同大版本对内部 API 的改动可能影响拦截效果,升级 Node 后建议跑一遍测试套件
- 模拟的响应体和真实服务可能有差异,别把 mock 当成集成测试,边界行为还是要靠真实环境验证
- 拦截规则是 host 级别匹配,精确区分大小写和端口,写错一点就静默不生效
使用场景
- 单元测试依赖第三方用户接口时,希望返回固定数据避免真实请求
- 需要模拟超时和错误响应,验证应用的重试与降级逻辑是否生效
- CI 流水线里跑集成测试,要求全程不访问外部网络也能稳定通过
- 为请求库补测试,确认直接使用 http.ClientRequest 的路径也被拦截
适合人员
- 编写 Node.js 后端接口测试的工程师,想摆脱对真实第三方服务的依赖
- 维护开源 HTTP 客户端库的开发者,需要验证在多种网络异常下的行为
- 负责 CI 流水线的基础设施工程师,要求测试在隔离网络环境中可重复运行
- 为内部服务编写集成测试的技术负责人,希望锁定外部接口的返回结构