You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将cy.intercept拦截的请求体保存到外部变量

原写法失效原因

Cypress 的所有命令均为异步队列执行模式,cy.intercept 仅会将拦截逻辑注册到队列中,你写在 cy.intercept 后的同步代码会先于拦截回调触发,此时外部的 request 变量还未被赋值,因此无法直接按原有写法获取值。

可行替代方案

方案1:使用别名+cy.wait 直接获取请求体(官方推荐)

这是最符合Cypress设计规范的实现方式,无需额外声明外部变量:

// 注册拦截并设置别名
cy.intercept("POST", "/url**", (req) => {
  req.reply({
    body: response // 替换为你自定义的mock返回值
  });
}).as('targetPostRequest');

// 此处放置触发该POST请求的操作,例如点击提交按钮
cy.get('#submit').click();

// 等待拦截命中,从拦截结果中直接拿到请求体
cy.wait('@targetPostRequest').then(interception => {
  const requestBody = interception.request.body;
  // 直接调用其他函数,将请求体作为参数传入即可
  yourCustomFunc(requestBody);
});

方案2:将请求体挂载到测试上下文共享

如果需要在同个测试用例的多个位置复用请求体,可以存到Mocha的测试上下文this中:

注意:测试用例的回调不能使用箭头函数,否则this指向会异常

it('测试用例名称', function() {
  cy.intercept("POST", "/url**", (req) => {
    req.reply({ body: response });
  }).as('targetPostRequest');

  cy.get('#submit').click();
  // 将请求体存为上下文别名
  cy.wait('@targetPostRequest').its('request.body').as('savedReqBody');

  // 后续需要使用的位置,通过.then回调从上下文取值
  cy.then(() => {
    yourCustomFunc(this.savedReqBody);
  });
});

方案3:保留外部变量写法(调整取值时机)

如果一定要用外部let变量存储,只需要把读取变量的逻辑放到拦截命中后的异步回调中即可:

let request;
cy.intercept("POST", "/url**", (req) => {
  request = {...req.body};
  req.reply({ body: response });
}).as('targetPostRequest');

cy.get('#submit').click();
// 必须等待拦截触发完成后,再读取外部变量
cy.wait('@targetPostRequest').then(() => {
  // 此时request已经完成赋值,可以正常使用
  yourCustomFunc(request);
});

内容的提问来源于stack exchange,提问作者hamvee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:45:03