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

如何让Cypress测试在出现CONREFUSED错误时自动失败?

如何让Cypress在出现CONNREFUSED的Ajax调用时使测试失败

针对你遇到的后台未拦截API触发CONNREFUSED错误、希望这类错误直接导致测试失败的需求,可以通过以下两种方式实现:

方法一:全局监听网络请求错误

在Cypress组件测试的支持文件(cypress/support/component.js)中添加全局事件监听,捕获XHR和Fetch请求的连接失败错误,并主动抛出异常终止测试。

Cypress.on('window:before:load', (win) => {
  // 监听XHR请求的错误事件
  win.addEventListener('error', (event) => {
    const target = event.target;
    // 判断是否是XMLHttpRequest或资源请求的连接失败
    if ((target instanceof XMLHttpRequest || target.src || target.href) && 
        event.error?.message.includes('ECONNREFUSED')) {
      throw new Error(`连接失败: ${target.src || target.href || target.responseURL}`);
    }
  });

  // 重写Fetch方法捕获连接错误
  const originalFetch = win.fetch;
  win.fetch = async (...args) => {
    try {
      return await originalFetch(...args);
    } catch (error) {
      if (error.message.includes('ECONNREFUSED')) {
        throw new Error(`Fetch连接失败: ${args[0]}`);
      }
      // 重抛其他不相关错误
      throw error;
    }
  };
});

方法二:拦截所有未匹配的请求检查错误

在测试的beforeEach钩子中添加全局拦截器,捕获所有未被你显式用cy.intercept定义的请求,当这类请求出现CONNREFUSED错误时抛出异常。

beforeEach(() => {
  cy.intercept('*', (req) => {
    // 仅处理未被其他拦截器匹配的请求
    if (!req.routeHandler) {
      req.continue((res) => {
        if (res.error?.message.includes('ECONNREFUSED')) {
          throw new Error(`未拦截的API请求连接失败: ${req.url}`);
        }
      });
    }
  });
});

这两种方式都能实现你的需求:一旦后台出现未处理的CONNREFUSED请求,测试会直接失败,而非仅在日志中输出错误。如果有预期的未拦截请求,可以在拦截逻辑中添加白名单规则,避免误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:05:43