5月29日 00:23

Cypress 怎么拦截和模拟网络请求?

cy.intercept() 拦截匹配规则的 HTTP 请求,配合 .as() 别名和 cy.wait('@alias') 实现请求等待与断言。intercept 可返回固定 stub 响应、动态构造响应、修改请求头或延迟响应,让测试脱离真实 API 依赖。注意 intercept 必须在请求发起前注册,否则无法捕获。

追问

cy.intercept() 和已废弃的 cy.route() 有什么区别? route 只能拦截 XMLHttpRequest,intercept 同时支持 XHR 和 Fetch API。intercept 使用 RouteMatcher 对象匹配请求(支持 method、url、headers 等多维度),功能远超 route。Cypress 6+ 已弃用 route。

怎么 stub 一个带动态参数的请求? 用函数式 handler:cy.intercept('GET', '/api/users*', (req) => { req.reply({ body: mockData[req.query.page] }); }),根据 req.query 或 req.body 动态构造响应。

如何模拟网络错误和超时? cy.intercept('GET', '/api/data', { forceNetworkError: true }) 强制网络错误;cy.intercept('GET', '/api/data', { delay: 3000, statusCode: 200, body: {} }) 模拟超时或慢响应。

多个 intercept 匹配同一请求时哪个生效? 按注册顺序,最后注册的优先。建议用精确匹配规则(url + method + headers)避免冲突,或用 .as() 明确指定等待哪个。

写段代码

javascript
cy.intercept('GET', '/api/users*', (req) => { req.reply({ statusCode: 200, body: { users: [] } }); }).as('getUsers'); cy.visit('/users'); cy.wait('@getUsers').its('response.statusCode').should('eq', 200);
标签:Cypress