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

Cypress中如何更新已有intercept对应的fixture?

问题描述

我在beforeEach钩子中配置了cy.intercept,针对GET请求**/api/inquiries/*/style_file_sub_task_status,关联fixture文件style_file_sub_task_status.json;现在需要在测试用例中针对同一路由,改用fixture文件style_file_sub_task_status_already_approved.json以获取更新后的结果。请问该场景在Cypress中是否可行?如果可行,正确的实现方式是什么?

用户提供的原始代码:

context('Style File', () => {
  describe('Style File - Account Manager', () => {
    beforeEach(() => {
         
         cy.intercept("GET", "**/api/inquiries/*/style_file_sub_task_status", {
        fixture: "style_file_sub_task_status.json"
      }).as('getStyleFileSubTaskStatus');

    });

      it('Sub task Un-Approving', function () {
        cy.intercept("GET", "**/api/inquiries/*/style_file_sub_task_status", {
            fixture: "style_file_sub_task_status_already_approved.json"
         }).as('getStyleFileSubTaskStatus');

      cy.xpath('(//span[normalize-space()=\'Approved tech pack\'])[1]')
        .click();
      cy.get('#status').click();
      cy.findByText("Approved tech pack sub task status updated successfully")
        .should('be.visible');
    });
  });
});
回答

这个场景完全可行,Cypress支持在测试用例中覆盖beforeEach里注册的拦截规则,具体实现注意以下几点:

核心原理

Cypress的拦截器是按注册顺序匹配请求的——后注册的拦截器会被优先匹配,所以测试用例中定义的cy.intercept会覆盖beforeEach中的同名路由拦截规则。

修正后的代码示例

context('款式文件', () => {
  describe('款式文件 - 账户经理', () => {
    beforeEach(() => {
      cy.intercept("GET", "**/api/inquiries/*/style_file_sub_task_status", {
        fixture: "style_file_sub_task_status.json"
      }).as('getStyleFileSubTaskStatus');
    });

    it('取消子任务审批', function () {
      // 注册新拦截,覆盖beforeEach中的规则,建议使用不同别名避免混淆
      cy.intercept("GET", "**/api/inquiries/*/style_file_sub_task_status", {
        fixture: "style_file_sub_task_status_already_approved.json"
      }).as('getStyleFileSubTaskStatusUpdated');

      // 触发页面发起新的状态请求
      cy.xpath('(//span[normalize-space()=\'已审批技术包\'])[1]').click();
      cy.get('#status').click();

      // 等待新拦截的请求完成,确保页面已获取到更新后的fixture数据
      cy.wait('@getStyleFileSubTaskStatusUpdated');

      // 断言更新成功提示
      cy.findByText("已审批技术包子任务状态更新成功")
        .should('be.visible');
    });
  });
});

关键注意事项

  • 别名区分:给测试用例里的拦截器设置独立别名(比如getStyleFileSubTaskStatusUpdated),避免和beforeEach中的别名冲突,确保cy.wait()能精准等待新请求。
  • 等待请求完成:执行操作后必须用cy.wait()等待拦截的请求结束,否则页面可能还没拿到新的fixture数据,会导致断言失败。
  • 路由匹配优先级:只要测试用例中的拦截器注册在请求发起之前,就会优先生效,所以要确保cy.intercept写在触发请求的操作之前。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:43:17