Cypress如何基于请求体拦截同端点的多个相同POST请求
问题原因
你现有代码的核心问题是未正确获取请求体字段:Cypress拦截回调中的请求体存储在req.body属性下,直接访问req.locations无法获取到对应字段,导致判断逻辑失效。同时直接在拦截回调中写断言,会导致不符合条件的请求进入回调时直接抛出断言失败,中断用例执行。
解决方案
通过在拦截回调中判断请求体字段,仅给符合条件的请求分配别名,即可精准区分同端点不同请求体的请求。
单请求拦截(仅匹配locations长度>3的请求)
cy.intercept("POST", "**/spot", (req) => { // 仅当请求体中locations数组长度>3时,给当前请求分配postSPOT1别名 if (req.body?.locations?.length > 3) { req.alias = 'postSPOT1' } }) Weather.activateSPOTWeather() // wait只会等待符合上述条件的请求返回 cy.wait('@postSPOT1').its('response.statusCode').should("eq", 200)
多请求同时拦截(分别匹配两次不同的请求)
如果需要同时验证两次请求,可根据不同的数组长度分配不同别名:
cy.intercept("POST", "**/spot", (req) => { const locLength = req.body?.locations?.length if (locLength === 2) req.alias = 'postSPOTLength2' if (locLength === 4) req.alias = 'postSPOTLength4' }) Weather.activateSPOTWeather() // 分别等待两次请求返回并验证 cy.wait('@postSPOTLength2').its('response.statusCode').should("eq", 200) cy.wait('@postSPOTLength4').its('response.statusCode').should("eq", 200)
注意事项
- 代码中使用可选链操作符
?.是为了避免部分请求无locations字段时报错,你也可以根据实际业务场景调整判断逻辑。 - 如果你的请求体是FormData、序列化字符串等非JSON格式,需要先自行解析为对象后再做字段判断。
内容的提问来源于stack exchange,提问作者Dhamo
相关产品推荐
相关产品推荐

