ts-jest编写TypeORM实体单元测试 报默认连接未建立错误
问题根因
报错Cannot execute operation on "default" connection because connection is not yet established.的直接原因是你仅创建了TypeORM的DataSource实例,但从未调用初始化方法实际建立数据库连接,同时代码里还有3个会导致测试异常的隐性问题:
- 重复创建了两个独立的内存SQLite实例:手动
new Database(":memory:")创建的实例和TypeORM内部创建的实例完全隔离,前者没有被任何业务逻辑使用,属于冗余代码 teardownTestDB方法里的销毁操作没有加await,异步操作未完成就退出测试进程会导致资源泄漏- 实体路径用glob匹配时,如果测试运行的工作目录不对,会导致TypeORM加载不到实体,初始化出空表
- 初始化完成的DataSource没有触发连接建立,业务代码调用全局仓库方法时拿不到可用连接
修复方案
1. 修正testhelper.ts代码
删掉冗余的手动数据库实例创建逻辑,补上DataSource初始化调用,修正异步等待逻辑:
import { DataSource, DataSourceOptions } from "typeorm"; export class TestHelper { private static _instance: TestHelper; private dbConnect!: DataSource; private constructor() {} public static get instance(): TestHelper { if (!this._instance) this._instance = new TestHelper(); return this._instance; } async setupTestDB() { const dataSourceConfig: DataSourceOptions = { name: "default", type: "better-sqlite3", database: ":memory:", // 优先直接引入实体类,避免glob路径匹配失败,示例:entities: [User] entities: ["src/entity/**/*.ts"], synchronize: true, dropSchema: true // 测试环境开启,每次初始化清空旧表结构,避免历史数据干扰 }; this.dbConnect = new DataSource(dataSourceConfig); // 关键:调用initialize等待连接真正建立完成 await this.dbConnect.initialize(); } async teardownTestDB() { // 等待连接销毁完成再退出 if (this.dbConnect?.isInitialized) { await this.dbConnect.destroy(); } } }
2. 额外注意事项
- 如果修改后还是提示找不到实体,把
entities配置的glob路径替换成直接import的实体类数组,这是测试环境最稳定的配置方式,不会受运行时工作目录影响 - 建议在测试套件中增加
afterEach钩子,每个测试用例跑完后清空对应表数据,避免用例之间的测试数据互相污染 - 如果你的业务代码中是通过自定义DataSource实例拿仓库,而不是用TypeORM全局的
getRepository方法,需要把TestHelper中初始化好的dbConnect实例导出,供业务代码在测试环境下引用
内容的提问来源于stack exchange,提问作者BasDriver
相关产品推荐
相关产品推荐

