Testing 不能在一个文件中运行多个测试

Testing 不能在一个文件中运行多个测试,testing,jestjs,graphql,prisma,nexus-prisma,Testing,Jestjs,Graphql,Prisma,Nexus Prisma,我正在构建一个GraphQLAPI,我想用jest测试一些解析器和数据库 这是我的助手文件,在这里我设置了用于测试的上下文和Prisma客户端 import { PrismaClient } from "@prisma/client"; import { ServerInfo } from "apollo-server"; import { execSync } from "child_process"; import getPort,

我正在构建一个GraphQLAPI,我想用jest测试一些解析器和数据库

这是我的助手文件,在这里我设置了用于测试的上下文和Prisma客户端

import { PrismaClient } from "@prisma/client";
import { ServerInfo } from "apollo-server";
import { execSync } from "child_process";
import getPort, { makeRange } from "get-port";
import { GraphQLClient } from "graphql-request";
import { nanoid } from "nanoid";
import { join } from "path";
import { Client } from "pg";
import { server } from "../api/server";

type TestContext = {
  client: GraphQLClient;
  db: PrismaClient;
};

export function createTestContext(): TestContext {
  let ctx = {} as TestContext;
  const graphqlCtx = graphqlTestContext();
  const prismaCtx = prismaTestContext();

  beforeEach(async () => {
    const client = await graphqlCtx.before();
    const db = await prismaCtx.before();

    Object.assign(ctx, {
      client,
      db,
    });
  });

  afterEach(async () => {
    await graphqlCtx.after();
    await prismaCtx.after();
  });

  return ctx;
}

function graphqlTestContext() {
  let serverInstance: ServerInfo | null = null;

  return {
    async before() {
      const port = await getPort({ port: makeRange(4000, 6000) });
      serverInstance = await server.listen({ port });

      return new GraphQLClient(`http://localhost:${port}`);
    },
    async after() {
      serverInstance?.server.close();
    },
  };
}

function prismaTestContext() {
  const prismaBinary = join(__dirname, "..", "node_modules", ".bin", "prisma");
  let schema = "";
  let databaseUrl = "";
  let prismaClient: null | PrismaClient = null;

  return {
    async before() {
      schema = `test_${nanoid()}`;
      databaseUrl = `postgresql://user:123@localhost:5432/testing?schema=${schema}`;

      process.env.DATABASE_URL = databaseUrl;

      execSync(`${prismaBinary} migrate up --create-db --experimental`, {
        env: {
          ...process.env,
          DATABASE_URL: databaseUrl,
        },
      });

      prismaClient = new PrismaClient();

      return prismaClient;
    },
    async after() {
      const client = new Client({
        connectionString: databaseUrl,
      });
      await client.connect();
      await client.query(`DROP SCHEMA IF EXISTS "${schema}" CASCADE`);
      await client.end();

      await prismaClient?.$disconnect();
    },
  };
}
我的测试文件如下所示:

import { createTestContext } from "./__helpers";

const ctx = createTestContext();

it("register user", async () => {
  const testUser = {
    username: "Test",
    email: "test@test.com",
    password: "password",
  };
  const registerResult = await ctx.client.request(
    `
    mutation registerNewUser($username: String!, $email: String!, $password: String!) {
      register(username: $username, email: $email, password: $password) {
        user {
          user_id
          username
          email
        }
      }
    }
  `,
    {
      username: testUser.username,
      email: testUser.email,
      password: testUser.password,
    }
  );

  const resultUsername = registerResult.register.user.username;
  const resultEmail = registerResult.register.user.email;
  const resultUserID = registerResult.register.user.user_id;

  expect(resultUsername).toBe(testUser.username);
  expect(resultEmail).toBe(testUser.email);
  expect(resultUserID).not.toBeNull;

  const users = await ctx.db.user.findMany();
  const savedUser = users[0];

  expect(savedUser.username).toBe(testUser.username);
  expect(savedUser.email).toBe(testUser.email);
  expect(savedUser.user_id).toBe(resultUserID);
  expect(savedUser.first_name).toBeNull;
  expect(savedUser.last_name).toBeNull;
  expect(savedUser.role).toBe("USER");
  expect(savedUser.password).not.toBe(testUser.password);
});

it("all events", async () => {
  const eventsResult = await ctx.client.request(
    `
    query {
      allEvents {
        event_id
        title
        description
      }
    }
    `
  );

  expect(eventsResult.allEvents.length).toBe(0)
});
当我只运行一个文件和一个测试时,一切正常。但是,当我在一个文件中运行多个测试时,第一个测试运行正常,但后面的测试运行不正常。我收到这个错误:

The table `test_LjrcmbMjI4vLaDYM9-lvw.Event` does not exist in the current database.: {"response":{"errors":[{"message":"\nInvalid `prisma.event.findMany()` invocation:\n\n\n  The table `test_LjrcmbMjI4vLaDYM9-lvw.Event` does not exist in the current database.","locations":[{"line":3,"column":7}],"path":["allEvents"],"extensions":{"code":"INTERNAL_SERVER_ERROR","exception":{"code":"P2021","clientVersion":"2.11.0","meta":{"table":"test_LjrcmbMjI4vLaDYM9-lvw.Event"}}}}],"data":null,"status":200},"request":{"query":"\n    query {\n      allEvents {\n        event_id\n        title\n        description\n      }\n    }\n    "}}
另外,当我在单独的文件中运行两个测试时,每运行一次测试,我都会遇到以下错误:
监听EADDRINUSE:地址已在使用中:::4200

我做了nexus教程(第4步和第5步),他们解释了如何进行测试,但不知怎的,它不起作用。所以请帮帮我


我创建了一个回购协议,并对其进行了并行测试。测试环境设置在
prisma
文件夹中,在
tests
文件夹中创建了一个类似的帮助程序。

它对我没有帮助,因为您使用的是SQLite数据库,而不是Postgres数据库。以下是Postgres。想法是一样的,只是我在这里使用内省,您可以用我的SQLite示例中的Migrate命令替换这些命令。