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

Cypress中如何为外部服务实现Try/Catch逻辑?

处理Cypress中Google Maps API偶发失败的折中方案

你要的这种「优先真实请求,失败后降级Stub」的逻辑,Cypress完全可以实现,核心是利用cy.intercept的请求拦截能力结合状态标记来处理。以下是具体实现思路和代码示例:

核心实现步骤

  1. 标记请求失败状态:用变量记录Google Maps API是否已失败,失败后后续请求直接返回Stub。
  2. 拦截并处理请求:首次请求放行真实调用,检查响应状态;如果失败(状态码≥400)或超时,就标记状态并替换为Mock响应。
  3. 处理超时场景:结合cy.wait的catch方法捕获超时,同样标记状态并触发降级。

代码示例

// 标记是否已触发降级
let mapsApiFailed = false;

// 拦截Google Maps API请求
cy.intercept('GET', '**/maps/api/**', (req) => {
  // 如果已经失败过,直接返回Mock数据
  if (mapsApiFailed) {
    req.reply({
      statusCode: 200,
      body: {
        // 填入和真实API一致的Mock响应结构
        // 示例:results: [...], status: "OK"
      }
    });
    return;
  }

  // 首次尝试真实请求
  req.continue((res) => {
    // 检查响应是否异常
    if (!res || res.statusCode >= 400) {
      mapsApiFailed = true;
      // 记录失败日志(Cypress控制台可查看)
      Cypress.log({
        name: 'GOOGLE_MAPS_FAILURE',
        message: `API请求失败,状态码: ${res?.statusCode || '无响应'}`,
        consoleProps: () => ({
          请求URL: req.url,
          响应内容: res?.body || '无响应体'
        })
      });
      // 替换当前响应为Mock数据
      res.send({
        statusCode: 200,
        body: {
          // 同上面的Mock结构
        }
      });
    }
  });
}).as('googleMapsRequest');

// 等待请求,捕获超时情况
cy.wait('@googleMapsRequest', { timeout: 10000 })
  .catch((err) => {
    mapsApiFailed = true;
    Cypress.log({
      name: 'GOOGLE_MAPS_TIMEOUT',
      message: 'API请求超时,后续将使用Mock数据'
    });
  });

注意事项

  • Mock数据一致性:务必保证Mock数据的结构、字段和真实API完全匹配,否则测试通过但生产环境可能出问题。建议把Mock数据抽成单独的JSON文件维护。
  • 监控失败频率:不要依赖这个方案掩盖真实问题,定期查看Cypress日志中的失败记录,如果失败率超过预期(比如超过1/30),要排查网络环境或API本身的问题。
  • 测试价值平衡:这个方案保留了大部分真实API的测试场景,只有偶发失败时才降级,相比全Stub的方式,能更好地验证应用和Google Maps API的集成逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:03:43