关于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
相关产品推荐
相关产品推荐

