如何在 Nest 中使用带有 TypeORM 的内存数据库

J0h*_*j0h 7 typescript typeorm nestjs

我有一个其他服务依赖的 Nest 服务器。为了简化对这些其他服务的测试,我想启动一个不使用真实数据库的 Nest 服务器版本。相反,它应该使用内存数据库,如mongo-unit

我的想法是拥有一个生产主模块和一个测试主模块,其中测试模块将保持所有内容相同,但使用内存数据库。但是,我无法弄清楚如何设置它。

我知道我可以使用async提供者,但我不知道它如何与导入一起工作,这就是@nestjs/typeorm公开的内容:

// app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    ...
    TypeOrmModule.forRoot({
      type: 'mongodb',
      host: 'localhost',
      port: 27017,
      database: 'production',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    ...
  ],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

它需要是异步的,因为 mongo-unit 返回一个带有它监听的 URL 的承诺。所以我需要先启动 mongo-unit,然后才能初始化 TypeORM。我想象这样的事情:

// app.test.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import * as mongoUnit from 'mongo-unit';

@Module({})
export class AppModule {
  static async forRoot() {
    const dbUrl = new URL(await mongoUnit.start());
    return {
      imports: [
        TypeOrmModule.forRoot({
          type: 'mongodb',
          host: dbUrl.host,
          port: dbUrl.port,
          database: 'test',
          entities: [__dirname + '/**/*.entity{.ts,.js}'],
          synchronize: true,
        }),
      ],
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

如果数据库是异步启动的,如何换出数据库?
(如果除了两个单独的模块之外,还有其他方法可以解决这个问题,那么请告诉我!:))

J0h*_*j0h 3

使用异步动态模块应该是可能的。

或者,在测试中启动 mongo-unit 并将应用程序配置为连接到该数据库效果更好,因为测试可以控制该数据库。我正在使用后一种方法。(不幸的是,它存在一些问题。)