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

如何在Cypress中动态修改GraphQL请求的Fixture数据

在Cypress中拦截GraphQL请求并动态修改Fixture字段

核心思路

要实现复用Fixture并修改特定字段,不能直接通过req.reply({ fixture: 'mockData.json' })返回静态文件,需要先读取Fixture数据,修改指定字段后再返回修改后的完整对象。

单个测试用例的实现(TypeScript)

it('验证用户状态为CLAIMED的场景', () => {
  // 读取Fixture文件并指定类型
  cy.fixture<{
    data: {
      user: {
        user: {
          status: string;
          // 其他字段可按需添加类型定义
        };
      };
    };
  }>('mockData.json').then((mockData) => {
    // 修改目标字段
    mockData.data.user.user.status = 'CLAIMED';

    // 拦截GraphQL请求
    cy.intercept('POST', '/graphql', (req) => {
      // 匹配指定的operationName
      if (req.body.operationName === 'operationName') {
        // 返回修改后的完整数据
        req.reply(mockData);
      }
    });

    // 触发请求的页面操作
    cy.visit('/target-page');

    // 执行断言逻辑
    cy.get('[data-test="user-status"]').should('have.text', 'CLAIMED');
  });
});

封装为自定义命令(复用逻辑)

如果多个测试用例都需要修改该字段,可以封装成Cypress自定义命令,减少重复代码:

在cypress/support/commands.ts中添加:

// 定义数据类型,确保TypeScript类型安全
interface UserInviteData {
  id: string;
  sentAt: null | string;
  sendDate: null | string;
  status: string;
  __typename: string;
}

interface UserProfile {
  userId: number;
  inviteId: string;
  status: string;
  firstName: string;
  lastName: string;
  email: string;
  phone: string;
  user: null;
  invite: UserInviteData;
}

interface MockGraphQLResponse {
  data: {
    user: {
      user: UserProfile;
    };
  };
}

Cypress.Commands.add('interceptUserQueryWithStatus', (targetStatus: string) => {
  cy.fixture<MockGraphQLResponse>('mockData.json').then((mockData) => {
    // 修改指定字段
    mockData.data.user.user.status = targetStatus;
    // 拦截并返回修改后的数据
    cy.intercept('POST', '/graphql', (req) => {
      if (req.body.operationName === 'operationName') {
        req.reply(mockData);
      }
    });
  });
});

然后在测试用例中调用:

it('验证用户状态为CLAIMED的场景', () => {
  cy.interceptUserQueryWithStatus('CLAIMED');
  cy.visit('/target-page');
  cy.get('[data-test="user-status"]').should('have.text', 'CLAIMED');
});

it('验证用户状态为NEEDS_MORE的场景', () => {
  cy.interceptUserQueryWithStatus('NEEDS_MORE');
  cy.visit('/target-page');
  cy.get('[data-test="user-status"]').should('have.text', 'NEEDS_MORE');
});

关键注意事项

  • 匹配正确的operationName:确保req.body.operationName的值与实际GraphQL请求中的名称完全一致,否则无法触发拦截逻辑。
  • 字段路径准确性:修改字段时要严格对应Fixture的嵌套结构(示例中为mockData.data.user.user.status),路径错误会导致修改无效。
  • TypeScript类型定义:添加类型定义可以避免拼写错误,同时获得IDE的语法提示,提升代码可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:54