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

如何在Cypress测试中为API调用添加延迟以测试竞态条件?

在Cypress中给API路由添加延迟测试竞态条件的简便方法

别发愁啦,Cypress本身就提供了非常顺手的方式给特定API加延迟,比直接去stub window.fetch靠谱多了——毕竟cy.intercept()是专门在网络层处理路由拦截的,不管你的应用用fetch、axios还是其他HTTP库都能生效。

下面给你两种常用的实现方式:

1. 模拟响应并添加延迟

如果需要返回自定义的模拟数据,同时延迟响应,可以这么写:

// 拦截目标API,添加1.5秒延迟
cy.intercept('GET', '/api/your-target-endpoint', (req) => {
  setTimeout(() => {
    req.reply({
      statusCode: 200,
      body: {
        // 这里放你需要的模拟响应数据
        data: '模拟的返回内容'
      }
    });
  }, 1500); // 延迟时间,单位毫秒,这里是1.5秒
}).as('delayedMockApi');

2. 延迟真实API的响应

如果想保留真实的API返回内容,只是单纯延迟响应(更贴近真实测试场景),可以用req.continue()捕获真实响应后再延迟返回:

cy.intercept('GET', '/api/your-target-endpoint', (req) => {
  req.continue((res) => {
    // 延迟2秒后返回真实的API响应
    setTimeout(() => {
      res.send(res.statusCode, res.body);
    }, 2000);
  });
}).as('delayedRealApi');

测试时的配合用法

触发API请求后,你可以用cy.wait()等待延迟的API完成,再进行断言:

// 触发请求的操作,比如点击按钮
cy.get('#trigger-request-btn').click();

// 等待延迟的API请求结束
cy.wait('@delayedMockApi');

// 断言竞态条件下的页面状态
cy.get('#result-element').should('have.text', '预期的结果');

之前你尝试stub window.fetch效果不好,大概率是因为你的应用可能没有直接使用原生fetch,而是封装了HTTP请求工具(比如axios),这时候cy.intercept()的网络层拦截就会更可靠,能覆盖所有类型的HTTP请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:02