Cypress使用intercept在同一测试用例中调用同API带不同payload不生效问题
相同API多次调用不同payload的Cypress拦截解决方案
故障原因
你同时声明了两个匹配规则完全一致(PATCH方法、**/user/1路径)的cy.intercept拦截器,Cypress对同匹配规则的拦截器默认以最后声明的为准,因此第一次点击触发的请求也被匹配到了action2,第二次点击时没有剩余的action2匹配项,自然等待失败。
解决方案
方案1:每次触发请求前单独声明对应拦截器
和你原有写法逻辑对齐,改动最小:
it('call same api with different payload',()=>{ cy.visit('../app/intercept-identical.html'); // 第一次操作前声明对应拦截 cy.intercept('PATCH', `**/user/1`,{name:'thava'} ).as("action1") cy.get("#update-action1").click(); cy.wait('@action1'); // 第二次操作前声明对应拦截,自动覆盖之前同规则的拦截配置 cy.intercept('PATCH', `**/user/1`,{name:'prakash'} ).as("action2") cy.get("#update-action2").click(); cy.wait('@action2'); })
方案2:单个拦截器动态匹配请求返回响应
如果两次请求的payload有可区分的字段,你可以直接在一个拦截器内做逻辑判断,代码更简洁:
it('call same api with different payload',()=>{ cy.intercept('PATCH', `**/user/1`, (req) => { // 此处可替换为你实际业务中区分两次请求的payload字段判断逻辑 if(req.body.type === 'update1') { req.reply({name:'thava'}) } else if(req.body.type === 'update2') { req.reply({name:'prakash'}) } }).as("userUpdate") cy.visit('../app/intercept-identical.html'); cy.get("#update-action1").click(); cy.wait('@userUpdate'); cy.get("#update-action2").click(); cy.wait('@userUpdate'); })
核心规则提示
- 同匹配规则的
cy.intercept默认后声明的会覆盖先声明的,不要提前批量声明多个同规则拦截器 - 如果需要等待同一个接口的N次请求,可以直接按顺序调用N次
cy.wait('@拦截别名')即可
内容的提问来源于stack exchange,提问作者Thavaprakash Swaminathan
相关产品推荐
相关产品推荐

