Agent Skills
返回列表
💻

Nock HTTP 模拟库

开发编程 更新于 2026.08.30

将以下提示词粘贴到你的 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 流水线的基础设施工程师,要求测试在隔离网络环境中可重复运行
  • 为内部服务编写集成测试的技术负责人,希望锁定外部接口的返回结构