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
相关产品推荐
相关产品推荐

