无法仅从 NestJS 中的 TestingModule 连接到 MongoDB

Unable to connect to MongoDB only from TestingModule in NestJS

我正在对我的 NestJS 应用程序进行端到端测试,但出现以下错误:

[ExceptionHandler] Unable to connect to the database. Retrying (1)... +1977ms

这是我的 beforeEach 函数,我在其中初始化模块:

beforeEach(async () => {
  const mod = await Test.createTestingModule({
    imports: [
      ConfigModule.forRoot({ isGlobal: true, load: [cfg] }),
      MongooseModule.forRootAsync({
        useFactory: async (cfg: ConfigService) => {
          return {
            uri: cfg.get("mongouri"),
          };
        },
      }),
      AccountModule,
    ],
  }).compile();

  conf = mod.get<ConfigService>(ConfigService);

  app = mod.createNestApplication();
  await app.init();
});

最让我困惑的是,当我使用 nest start --watch 命令正常启动我的应用程序时(在我的 AppModule 中,MongooseModule 初始化与此处完全相同),一切都完美无缺,所以我想问题出在 TestingModule 的某个地方,我不知道具体在哪里以及我该怎么做。

我不完全确定,但显然我以某种方式改进了我的 Jest 配置。从 moduleDirectories 中删除根目录确实解决了问题。

"moduleDirectories": [
    "node_modules",
    ""
],

"moduleDirectories": [
    "node_modules"
],

我不知道它是如何以及为什么起作用的,很高兴听到比我更有能力的人的原因。

我什至将这行添加到 Jest 配置的主要原因只是因为我懒得在我一半的项目文件中将绝对路径更改为相对路径。

那是因为这一行。

https://github.com/nestjs/mongoose/blob/01bc29db10f92005f9acdfc7ab4eb2087cdb0387/lib/mongoose-core.module.ts#L103

import * as mongoose from 'mongoose';
  ...

  static forRootAsync(options: MongooseModuleAsyncOptions): DynamicModule {
        ...
        return await defer(async () =>
          mongooseConnectionFactory(
            mongoose.createConnection(mongooseModuleOptions.uri as string, {
              useNewUrlParser: true,
              useUnifiedTopology: true,
              ...mongooseOptions,
            }),
        ...
  }

如果在moduleDirectories 上添加"""./" 路径,mongoose 模块指向此处。 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/mongoose/index.d.ts#L78

没有 createConnection 方法,因此在调用 mongoose.createConnection() 时发生 mongoose.createConnection is not defined 错误。