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

使用cy.intercept时如何捕获未处理的请求?

如何让Cypress捕获未存根的请求并抛出错误

核心思路

利用Cypress拦截器的注册顺序匹配规则:请求会按拦截器的注册顺序依次匹配,第一个匹配成功的拦截器会处理请求,后续拦截器不再触发。因此只需在所有业务存根拦截器之后,注册一个通配符拦截器,即可捕获所有未被前面规则匹配的请求,并抛出错误提示。

具体实现步骤

  1. 先注册所有业务相关的cy.intercept存根,确保这类拦截器优先匹配请求。
  2. 最后注册全局通配符拦截器,过滤掉无需监控的请求后,对剩余未匹配请求抛出错误。

代码示例

基础版本(单测试用例)

// 先定义业务接口的存根
cy.intercept('GET', '/api/products', { fixture: 'products.json' });
cy.intercept('POST', '/api/checkout', { statusCode: 200, body: { orderId: '12345' } });

// 最后注册捕获未存根请求的拦截器
cy.intercept('*', (req) => {
  // 排除Cypress自身请求、静态资源等无需监控的请求
  const excludedPatterns = [
    '__cypress',
    '/static/',
    '/favicon.ico',
    '/assets/'
  ];

  const shouldIgnore = excludedPatterns.some(pattern => req.url.includes(pattern));
  if (shouldIgnore) return;

  // 抛出错误,终止测试并提示未存根请求信息
  throw new Error(`发现未存根的请求: ${req.method} ${req.url}`);
});

全局生效版本(所有测试自动检测)

如果希望所有测试都自动校验未存根请求,可以在cypress/support/e2e.js或测试文件的beforeEach钩子中配置:

beforeEach(() => {
  // 封装的业务存根注册函数(可根据项目实际调整)
  cy.registerApiStubs();

  // 捕获未存根请求
  cy.intercept('*', (req) => {
    // 仅监控应用自身的API域名
    const targetDomains = ['your-app-domain.com', 'localhost:3000'];
    const isTargetDomain = targetDomains.some(domain => req.url.includes(domain));
    if (!isTargetDomain) return;

    // 排除静态资源路径
    const excludedPaths = ['/static', '/images', '/css'];
    const isExcluded = excludedPaths.some(path => req.url.includes(path));
    if (isExcluded) return;

    // 直接回复错误并抛出异常,让测试失败
    req.reply({
      statusCode: 500,
      body: { message: '未存根请求被拦截' }
    });
    throw new Error(`测试拦截到未存根请求: ${req.method} ${req.url}`);
  });
});

关键说明

  • 拦截器顺序:必须将通配符拦截器放在所有业务存根之后,否则会优先匹配所有请求,导致业务存根失效。
  • 排除规则:务必排除Cypress内部请求、静态资源等非业务API请求,避免误报。
  • 错误提示:通过throw new Error可以直接让测试失败,并在控制台显示具体的未存根请求信息,方便快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:35:21