【问题标题】:Create a separate (in memory) database for each test为每个测试创建一个单独的(在内存中)数据库
【发布时间】:2021-09-21 15:22:14
【问题描述】:

是否可以为每个测试创建一个内存数据库?

我目前使用以下代码,如果我只运行一个测试文件或使用--run-in-band 选项,则该代码有效。

import _useDb from "@/useDb";
import { mocked } from "ts-jest/utils";
import { createConnection, getConnection } from "typeorm";

const useDb = mocked(_useDb);

jest.mock("@/useDb");

beforeEach(async () => {
  useDb.mockImplementation(async (action) => {
    const db = await createConnection({
      type: "sqlite",
      database: ":memory:",
      dropSchema: true,
      entities: [Entity],
      synchronize: true,
      logging: false,
    });

    await action(db);
  });
});

afterEach(async () => {
  const con = getConnection();

  await con.close();
});

但只要我同时运行多个测试,我就会得到:

CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established.

我想我可以提供一个带有随机 uuid 的名称属性,就像他们在 How to create separate in memory database for each test? 中建议的那样,但这真的是要走的路吗?是不是有某种参数告诉 TypeORM“请不要创建按名称索引的连接”(或者它正在做什么)?

【问题讨论】:

  • 检查你的测试以及你做了什么。我在使用不同的库(mock-fs)时遇到了类似的问题,因为我在 beforeEach 的早期加载了它,而不是在 beforeEach 中的最后一件事,所以我在访问数据时也遇到了一些随机错误。
  • @StevenScott 好的,一定要记住这些错误总是最糟糕的,但正如我所说,它在我通过工作池运行测试时发生。因此,多个默认连接以某种方式进入 TypeORM 池。
  • @StevenScott 所以我认为你是对的。不知道我是如何让它工作的,但它现在可以工作了。谢谢:D
  • 很高兴我为您指明了正确的方向?我知道使用 Mock-FS,一旦我这样做了,任何试图访问操作系统的东西都会失败,所以这就是我的问题,即使它是测试代码,我认为在模拟之前已经编译并运行了。我认为这也可能与 Jest 的并行执行有关,但不是 100% 肯定,因为我没有尝试在序列模式下运行来验证这一点。可能是您的 afterAll() 在不同的测试中被调用,并且可能与这些测试中的模拟混淆?不确定,但很高兴你让它工作。

标签: typescript sqlite jestjs typeorm


【解决方案1】:

所以我让它工作,现在确定如何,但也许这对未来的人有帮助。这是我的beforeEachafterEach

beforeEach(async () => {
  const con = await createConnection({
    type: "sqlite",
    database: ":memory:",
    dropSchema: true,
    entities: [],
    synchronize: true,
    logging: false,
  });

  mockGetDbConnection.mockResolvedValue(con);
});

afterEach(async () => {
  const con = getConnection();

  await con.close();
});

mockGetDbConnection 是服务获取数据库句柄的函数。如果您没有,您很可能只想使用 TypeORM 提供的getConnection

我也有这个玩笑setupFilesAfterEnv,它看起来像一个魅力。

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 2020-02-21
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多