You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress拦截请求时spy无法获取callCount问题求助

问题1:spy创建方式是否正确?

你的写法不正确。问题出在cy.intercept('POST', '/api/user/pageview', cy.spy().as('postSpy'))这行代码:cy.spy()是Cypress的异步命令,返回的是命令链对象,而非直接的spy函数。cy.intercept的第二个参数需要是请求处理函数、静态响应或配置对象,直接传入cy.spy()无法将spy绑定到请求处理逻辑上,导致别名@postSpy对应的不是spy实例,后续cy.get('@postSpy')自然取不到正确的spy对象。

问题2:如何获取别名对应的调用次数?

需要先修正spy的创建方式,再正确获取调用次数,以下是两种可行方案:

方案1:使用Jasmine Spy(更简洁)

直接创建Jasmine spy实例,在拦截请求时调用它,之后可直接访问callCount:

// 创建Jasmine spy
const pageviewSpy = jasmine.createSpy('pageviewSpy');

cy.intercept('POST', '/api/order/').as('orderPublished');
// 拦截pageview请求时调用spy
cy.intercept('POST', '/api/user/pageview', (req) => {
  pageviewSpy();
});

cy.wait('@orderPublished').then(() => {
  // 直接访问spy的callCount属性
  cy.log('pageViewPostCount --> ', pageviewSpy.callCount);
});

方案2:使用Cypress Spy(正确绑定方式)

先创建Cypress spy并别名,再将其作为请求处理函数传入cy.intercept,最后通过异步命令获取spy实例:

cy.intercept('POST', '/api/order/').as('orderPublished');
// 先创建spy并别名,再作为处理函数传入intercept
cy.intercept('POST', '/api/user/pageview', cy.spy().as('postSpy'));

cy.wait('@orderPublished').then(() => {
  // 通过cy.get获取spy实例,在then回调中访问callCount
  cy.get('@postSpy').then((spy) => {
    cy.log('pageViewPostCount --> ', spy.callCount);
  });
  // 或者用its简化
  // cy.get('@postSpy').its('callCount').then(count => {
  //   cy.log('pageViewPostCount --> ', count);
  // });
});

两种方案的核心都是确保spy被正确绑定到请求处理流程中,再通过异步方式获取spy实例的callCount属性(因为Cypress命令是异步执行的,不能同步访问命令返回值)。

内容的提问来源于stack exchange,提问作者JavaJd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:55:17