Как обеспечить MockService в разработке с Nest.js? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть класс MailService и класс MailMockService, которые следует использовать в разработке.

Согласно документации Nest , она должна работать следующим образом:

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 в зависимости от среды?

Edit:

Я пользуюсь услугой так:

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

Я думаю, import обходит предоставленное MailService / MailMockService от Module (код все еще работает без объекта в массиве providers). Но как я могу сказать программе использовать MailMockService?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Если вы создаете экземпляр службы самостоятельно, а не используете инъекцию зависимостей в гнезде, вы отрицаете цель платформы.

Но как мне сказать программе использовать MailMockService?

Это именно то, что делает внедрение зависимостей таким замечательным: вы можете контролировать зависимости, которые используются в ваших модулях (классах, модулях, ...), не изменяя сами эти модули. Отлично подходит для тестирования или специфики среды, как в вашем случае.

Таким образом, класс, который использует MailService, должен быть создан фреймворком и затем может вставить MailService с помощью:

constructor(private mailService: MailService) {}

Тогда будет использоваться экземпляр, предоставленный в вашем массиве providers.


Если это невозможно, вы, конечно, можете иметь логику в самом классе (ах) потребления (не очень хорошо!):

const mailService = process.env.NODE_ENV === 'development' 
                    ? new MailMockService()
                    : new MailService();
0 голосов
/ 04 апреля 2019

Вот как бы я это сделал:

const mailerSvc = process.env.NODE_ENV === 'DEV' 
    ? require('path/to/mock')
    : require('path/to/real/thing')
...