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

关于Cypress中Test定义及cy.intercept()拦截器清除时机的问询

Cypress中cy.intercept()存根清除时机及Test/Suite定义确认

核心结论

  • 完全正确:每个it(...)(或等价的specify(...))块就是Cypress文档中提到的Test
  • 完全正确:每个describe(...)(或等价的context(...))块就是文档中所说的Suite

拦截器清除逻辑说明

Cypress的自动清除规则是:所有通过cy.intercept()定义的存根/拦截器,都会在每个Test(即每个it块)执行前被自动清除。

这意味着:

  • 不管拦截器是定义在Suite的before()、beforeEach()钩子中,还是直接写在某个Test内部,只要当前Test执行完毕,对应的拦截器就会被清理
  • 每个Test启动时,都会拥有一个全新的拦截器环境,不会受到上一个Test中定义的拦截器影响

示例代码验证

describe('订单管理 Suite', () => {
  beforeEach(() => {
    // 这个拦截器会在每个it块执行前被清除后重新初始化
    cy.intercept('GET', '/api/orders', { fixture: 'orders.json' }).as('getOrders')
  })

  it('验证订单列表加载 Test', () => {
    cy.visit('/orders')
    cy.wait('@getOrders')
    // 当前it块执行完毕后,所有拦截器(包括这个@getOrders)都会被清除
  })

  it('验证订单筛选功能 Test', () => {
    // 上一个it的拦截器已被清除,这里可以安全定义新的拦截规则
    cy.intercept('GET', '/api/orders?status=paid', { fixture: 'paid-orders.json' }).as('getPaidOrders')
    cy.visit('/orders')
    cy.get('[data-testid="status-filter"]').select('已支付')
    cy.wait('@getPaidOrders')
  })
})

额外提示

如果需要在整个Suite的所有Test中复用相同的拦截规则,建议将拦截器定义在beforeEach()钩子中,而不是before()——因为before()只会执行一次,而Cypress会在每个Test前清除拦截器,beforeEach()能确保每个Test都能重新拿到有效的拦截配置,避免Test间的状态污染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:24:59