You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:45:35