如何让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
相关产品推荐
相关产品推荐

