【发布时间】: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