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

