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

如何在Cypress v13中模拟GraphQL Subscription为单次返回的查询?

在Cypress中模拟GraphQL Subscription(单次返回数据)

可以实现,无需直接处理WebSocket协议,从React Apollo客户端层面拦截订阅逻辑更简单,以下是两种实用方案:

方案1:重写Apollo客户端的subscribe方法

通过Cypress获取页面的Apollo客户端实例,重写其订阅方法,直接返回包含模拟数据的一次性Observable:

cy.window().then((win) => {
  const client = win.apolloClient; // 需确保应用在测试环境把client挂载到window
  const originalSubscribe = client.subscribe;

  client.subscribe = (options) => {
    // 根据订阅名称匹配目标操作
    const subscriptionName = options.query.definitions[0].name.value;
    if (subscriptionName === '你的订阅名称') {
      return new win.ApolloClient.Observable((observer) => {
        observer.next({ 
          data: { 
            // 填入你的模拟数据结构
            exampleSubscription: { id: '1', content: '模拟订阅数据' }
          } 
        });
        observer.complete(); // 立即完成,只返回一次数据
      });
    }
    // 非目标订阅保留原逻辑
    return originalSubscribe(options);
  };
});

方案2:Stub React Apollo的useSubscription钩子

如果组件使用useSubscription钩子,可以直接拦截这个钩子返回模拟结果:

cy.window().then((win) => {
  const { useSubscription } = win.require('@apollo/client');
  const originalUseSubscription = useSubscription;

  cy.stub(win.require('@apollo/client'), 'useSubscription').callsFake((query, options) => {
    const subscriptionName = query.definitions[0].name.value;
    if (subscriptionName === '你的订阅名称') {
      return {
        data: { /* 模拟数据 */ },
        loading: false,
        error: undefined
      };
    }
    return originalUseSubscription(query, options);
  });
});

前置准备

在应用代码的测试环境中,将Apollo客户端实例挂载到window对象,方便Cypress访问:

// 应用初始化代码
if (process.env.NODE_ENV === 'test') {
  window.apolloClient = apolloClientInstance;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:40