使用`createTestingModule`时从实例化的动态模块中检索对服务的引用

问题描述 投票:0回答:1

具有以下全局动态模块的定义:

// prisma.module.ts
import { DynamicModule, Global, Module } from '@nestjs/common'
import { PrismaService } from 'nestjs-prisma'

@Global()
@Module({})
export class PrismaModule {
  static register(options: {
    databaseUrl: string
  }): DynamicModule {
    return {
      module: PrismaModule,
      providers: [
        {
          provide: PrismaService,
          useFactory: () =>
            new PrismaService({
              prismaOptions: {
                datasources: {
                  db: {
                    url: options.databaseUrl,
                  },
                },
              },
            }),
        },
      ],
      exports: [PrismaService],
    }
  }
}

我正在使用

Test.createTestingModule
来编译和测试一个不是顶级
AppModule
的模块(假设是
MyModule
)。该模块依赖于全局动态模块
PrismaModule
,因此我必须使用此 GitHub 问题中提到的技巧来覆盖它:

// app.module.ts

export const prismaModule = PrismaModule.register({
  databaseUrl: process.env.DB_URL,
})

@Module({
  imports: [
    // ...
    prismaModule,
    // ...
  ],
})
export class AppModule {
  constructor() {}
}
// my-module.test.ts

import { prismaModule } from '../app.module'

// ...

const mockPrismaModule = PrismaModule.register({
  databaseUrl: "<some connection string>",
})

const moduleRef = await Test.createTestingModule({
  imports: [prismaModule],
  controllers: [MyController],
  providers: [MyService],
})
  .overrideModule(prismaModule)
  .useModule(mockPrismaModule)
  .compile()

const prismaService = mockPrismaModule.<...>

有没有办法访问动态

PrismaService
mockPrismaModule
期间创建的
PrismaModule
register()
实例?我尝试过使用
mockPrismaModule.get(PrismaService)
但似乎不能像使用
Test.createTestingModule()
的结果那样使用它。

nestjs
1个回答
0
投票

你应该可以使用

moduleRef.get(PrismaService, { strict: false })

© www.soinside.com 2019 - 2024. All rights reserved.