Cypress intercept问题:认证中间件校验不存在URL返回404如何解决
解决方案
问题根因
你当前编写的拦截规则为精确匹配固定路径/users/hello,但URL最后一段是动态生成的变量,无法命中拦截规则,请求会直接发送到真实服务端,才会返回404和认证错误。Cypress的cy.intercept只要命中匹配规则,就会直接返回你定义的Stub响应,不会转发请求到后端,只需调整匹配规则即可解决问题。
可用解决方法
- 通配符匹配动态路径
如果不需要严格校验最后一段的具体值,直接用*通配符匹配/users/后的任意路径段即可:
// * 匹配/users/后的任意动态路径段 cy.intercept("POST", "/users/*", { fixture: "test.json" }).as("getTestUser");
该规则会匹配所有POST方法发送到/users/下任意二级路径的请求,命中后直接返回test.json的内容,不会向后端发送真实请求。
- 动态拼接精确匹配规则
如果你需要精准匹配从前序响应拿到的具体动态值,可以先把前序Mock返回的动态值存储下来,再拼接生成精确的拦截路径:
// 假设前序请求拿到的动态值存在别名userSlug中 cy.get("@userSlug").then(slug => { cy.intercept("POST", `/users/${slug}`, { fixture: "test.json" }).as("getTestUser"); })
该方法的优势是不会误拦同路径前缀下的其他业务请求,适合多场景混合测试的情况。
- 自定义路由匹配函数
如果匹配逻辑更复杂,可以用函数自定义匹配规则,灵活控制哪些请求需要返回Stub:
cy.intercept("POST", (req) => { // 自定义匹配逻辑,示例为匹配所有路径包含/users/的POST请求 if(req.url.includes('/users/')) { req.reply({ fixture: "test.json" }) } }).as("getTestUser")
注意事项
- 拦截代码必须在对应请求触发前执行,否则会出现拦截不生效的问题。
- 如果你的请求是带完整域名的绝对路径,可以用
**/users/*的写法,**可以匹配任意域名和路径前缀,适配不同测试环境的域名差异。
内容的提问来源于stack exchange,提问作者dush
相关产品推荐
相关产品推荐

