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

Cypress中addUser GraphQL/MongoDB突变测试的重复执行及删除难题

解决方案

1. 改造addUser Mutation支持变量传递

先修改你的addUser GraphQL查询,替换硬编码的用户信息,改成支持动态变量的形式:

// ../GraphQLBody/Users.js
export const addUser = `
mutation AddUser($name: String!, $email: String!, $password: String!) {
  addUser(name: $name, email: $email, password: $password) {
    token
    user {
      id
      name
      email
    }
  }
}
`;

2. 生成唯一用户数据避免重复冲突

利用时间戳生成唯一邮箱,确保每次测试都创建全新用户,彻底解决MongoDB的重复用户报错问题。

3. 保存用户ID并完成deleteUser测试

创建用户后提取动态生成的userId,用于后续删除操作;同时用afterEach钩子保证无论测试成功或失败,都清理掉创建的用户,维持测试环境干净。

修改后的完整测试代码:

import {
  addUser,
  login,
  allUsers,
  findUserById,
  deleteUser,
} from "../GraphQLBody/Users";

describe("User Queries and Mutations", () => {
  const URL = "http://localhost:3001/graphql";
  let createdUserId; // 存储创建的用户ID

  // 测试结束后自动清理用户
  afterEach(() => {
    if (createdUserId) {
      cy.request({
        url: URL,
        method: "POST",
        body: {
          query: deleteUser,
          variables: { id: createdUserId }
        },
      });
    }
  });

  it("Creates a new user and verifies deletion", () => {
    // 生成唯一邮箱
    const uniqueEmail = `test.user+${Date.now()}@gmail.com`;
    
    // 创建用户
    cy.request({
      url: URL,
      method: "POST",
      body: {
        query: addUser,
        variables: {
          name: "Test User",
          email: uniqueEmail,
          password: "test123"
        },
      },
    }).then((res) => {
      expect(res.status).to.eq(200);
      expect(res.body.data.addUser).to.exist;

      const { token, user } = res.body.data.addUser;
      createdUserId = user.id; // 保存用户ID供删除使用

      // 验证用户信息
      expect(token).to.be.a("string");
      expect(user.name).to.eq("Test User");
      expect(user.email).to.eq(uniqueEmail);
    });

    // 执行删除操作
    cy.request({
      url: URL,
      method: "POST",
      body: {
        query: deleteUser,
        variables: { id: createdUserId }
      },
    }).then((res) => {
      expect(res.status).to.eq(200);
      expect(res.body.data.deleteUser).to.be.true; // 假设deleteUser返回布尔值表示成功

      // 验证用户已被删除
      cy.request({
        url: URL,
        method: "POST",
        body: {
          query: findUserById,
          variables: { id: createdUserId }
        },
      }).then((findRes) => {
        expect(findRes.body.data.findUserById).to.be.null;
      });
    });
  });
});

额外优化提示

  • 如果deleteUser需要认证,可在创建用户后保存token,在删除请求的headers中添加认证信息:
    cy.request({
      url: URL,
      method: "POST",
      headers: { Authorization: `Bearer ${token}` },
      body: {
        query: deleteUser,
        variables: { id: createdUserId }
      },
    });
    
  • 可将用户创建逻辑封装成Cypress自定义命令,方便在多个测试用例中复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:40:05