Как обеспечить Injected-константу для обслуживания в nestjs при модульном тестировании - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь создать модульные тесты для моего небольшого приложения.Я хочу протестировать службу, которая использует внедренные конфигурации, и другие службы.

@Injectable()
export class AuthService {
        private readonly localUri: string;

        constructor(
            @Inject(CORE_CONFIG_TOKEN) private readonly coreConfig: ICoreConfig,
            @Inject(PROVIDER_CONFIG_TOKEN) private readonly providerConfig: IProviderConfig,
            private readonly _httpService: HttpService,
            private readonly _usersService: UsersService,
        ) {
            this.localUri = `http://${this.coreConfig.domain}:${this.coreConfig.port}`;
        }

        ...


        /**
         * Checks if a given email is already taken
         * @param email
         */
        async isEmailTaken(email: string): Promise<boolean> {
            return (await this._usersService.findUserByEmail(email)) !== undefined;
        }

        ...

Я не понимаю, как проверить эту службу.Я не знаю, как предоставить правильного поставщика TestModule для введенной конфигурации @Inject(CORE_CONFIG_TOKEN) private readonly coreConfig: ICoreConfig

    const testCoreConfig = '{...}'
    const module = await Test.createTestingModule({
      providers: [AuthService, {
           provide: 'CORE_CONFIG_TOKEN',
           useClass: testCoreConfig ,
      }],
    }).compile();

Также я не уверен, нужно ли мне создавать другие импортированные сервисы.Я просто хотел бы проверить, если они называются.И если это так, верните ложные данные.Это я могу сделать, но я застрял с настройкой модуля.

Все образцы, которые я нашел до сих пор, где только сервисы с одним хранилищем.И более-менее проверяет, существует ли услуга.Но никаких проверок против логики реализации и связей между классами.

Надеюсь, мой вопрос ясен Спасибо

1 Ответ

0 голосов
/ 30 сентября 2018

Я думаю, вам следует использовать свойство useValue вместо useClass, если вы передаете объект с ключевыми значениями?

providers: [
    {
        provide: CORE_CONFIG_TOKEN,
        useValue: {
           domain: 'nestjs.com',
           port: 80,
        },
    },
],

Также имеется некоторая документация по созданию провайдера / службы конфигурации в nestjs для ваших модулей.

Я также создал nestjs-config модуль, который вы можете использовать аналогично этому.

@Injectable()
class TestProvider {
    constructor(private readonly @InjectConfig() config) {
        this.localUri = config.get('local.uri');
    }

@Module({
    imports: [ConfigModule.load('path/to/config/file/*.ts')],
    providers: [TestProvider],
})
export AppModule {}

//config file 'config/local.ts'
export default {
    uri: `https://${process.env.DOMAIN}:/${process.env.PORT}`,
}
...