Cypress中如何为外部服务实现Try/Catch逻辑?
处理Cypress中Google Maps API偶发失败的折中方案
你要的这种「优先真实请求,失败后降级Stub」的逻辑,Cypress完全可以实现,核心是利用cy.intercept的请求拦截能力结合状态标记来处理。以下是具体实现思路和代码示例:
核心实现步骤
- 标记请求失败状态:用变量记录Google Maps API是否已失败,失败后后续请求直接返回Stub。
- 拦截并处理请求:首次请求放行真实调用,检查响应状态;如果失败(状态码≥400)或超时,就标记状态并替换为Mock响应。
- 处理超时场景:结合
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
相关产品推荐
相关产品推荐

