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

如何清理Cypress中cy.intercept捕获的请求队列?

解决方案1:主动消费重置请求的拦截队列

该方案改造成本最低,无需调整现有spyOnGraphQL逻辑,只需在执行重置过滤器操作后,主动调用一次cy.wait将重置触发的GraphQL请求从拦截队列中移除,后续测试过滤器时的cy.wait就会匹配到最新的过滤请求。
参考调用逻辑:

// 测试过滤器1
applyFilter(1)
cy.wait(`@${operationName}`).should(({response}) => {
  // 校验过滤器1返回结果逻辑
})

// 执行重置操作 + 消费重置触发的请求
resetFilters()
cy.wait(`@${operationName}`) // 此处无需校验,仅清空队列中的重置请求即可

// 测试过滤器2
applyFilter(2)
cy.wait(`@${operationName}`).should(({response}) => {
  // 校验过滤器2返回结果逻辑
})

解决方案2:修改拦截规则,通过请求payload区分请求

如果需要更严谨的匹配避免错配,可以修改aliasQuery逻辑,增加对请求参数的校验规则,因为重置过滤器的请求和正常过滤请求的variables字段必然存在差异(比如重置时filters为空,正常过滤时filters有具体值),仅符合参数规则的请求才会被打上别名。
修改后的工具函数代码:

function aliasQuery(
  request: CyHttpMessages.IncomingHttpRequest,
  operationName: string,
  matchVariables?: Record<string, any>
): void {
  const { body } = request;
  if (body.operationName !== operationName) return;
  // 传入参数匹配规则时,校验variables是否符合要求
  if (matchVariables) {
    const isMatch = Object.entries(matchVariables).every(([key, expectedVal]) => {
      return body.variables?.[key] === expectedVal
    })
    if (!isMatch) return
  }
  request.alias = operationName;
}

export function spyOnGraphQL(operationName: string, matchVariables?: Record<string, any>): void {
  cy.fixture('hosts').then(({ graphQLHostname }) => {
    cy.intercept(ApiMethods.Post, graphQLHostname, (request) => {
      aliasQuery(request, operationName, matchVariables);
    });
  });
}

使用时只需在监听过滤请求时传入对应的参数匹配规则即可,重置请求因为不符合参数规则,不会被打上别名,自然不会被后续的cy.wait捕获。

补充说明

Cypress目前没有公开的API可以直接清空cy.intercept的请求队列,也可以通过重新调用spyOnGraphQL覆盖旧的拦截实例,新的拦截实例会自动清空历史请求队列,但该方案稳定性不如前两种,不优先推荐。

内容的提问来源于stack exchange,提问作者Slava.In

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:18:03