如何使用Nest.js在开发中提供MockService?

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

我有一个类MailService和一个类MailMockService应该用于开发。

根据Nest documentation,它应该像这样工作:

app.module.ts

@Module({
  imports: [...],
  controllers: [...],
  providers: [
    ...,
    {
      provide: MailService,
      useClass: (process.env.NODE_ENV === 'development') ? MailMockService : MailService,
    },
  ],
})
export class AppModule {
}

但是,它没有按预期工作。 process.env.NODE_ENV等于'development',但该模块仍然提供类MailService

如何根据环境使模块提供MailMockService

编辑:

我使用这样的服务:

import { MailService } from './mail/mail.service';
...
const mailService = new MailService();

我认为,import绕过了MailService提供的MailMockService / Module(代码仍然可以在providers数组中没有对象的情况下工作)。但是我怎么能告诉程序使用MailMockService

javascript node.js typescript dependency-injection nestjs
2个回答
1
投票

如果您自己创建服务的实例而不是使用嵌套的依赖注入,那么您就是在破坏框架的目的。

但是我怎么能告诉程序使用MailMockService

这正是使依赖注入如此强大的原因:您可以控制单元(类,模块......)中使用的依赖关系,而无需更改这些单元本身。非常适合测试或环境特定,例如您的情况。

所以使用MailService的类必须由框架创建,然后可以注入MailService

constructor(private mailService: MailService) {}

然后将使用providers数组中提供的实例。


如果这是不可能的,你当然可以在消费类中拥有逻辑(不是很好!):

const mailService = process.env.NODE_ENV === 'development' 
                    ? new MailMockService()
                    : new MailService();

0
投票

我将如何做到这一点:

const mailerSvc = process.env.NODE_ENV === 'DEV' 
    ? require('path/to/mock')
    : require('path/to/real/thing')
© www.soinside.com 2019 - 2024. All rights reserved.