Angular 2+ - 如何模拟用于环境变量的常量类



我想知道是否有人可以帮助我这个主题,我正在键入一些关于某些功能的单元测试,这些功能取决于当前运行的环境。

这是我想要创建单元测试的组件的源代码:

import { Component, OnInit } from '@angular/core';
// DEV environment
import { environment } from '@env/environment';
// PROD environment
// import { environment } from '@env/environment.prod';
import { Logger } from '@app/core/logger/logger.service';
import { I18nService } from '@app/core/language/i18n.service';
let log: Logger;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
providers: [I18nService]
})
export class AppComponent implements OnInit {
constructor(private i18nService: I18nService) {
log  = new Logger('X');
}
ngOnInit() {
// Setup logger
if (environment.isProduction) {
Logger.enableProductionMode();
}
log.debug('init');
// Setup translations
this.i18nService.init(environment.defaultLanguage, environment.supportedLanguages);
}

这是单元测试:

import * as environmentDEV from '@env/environment';
import * as environmentPRO from '@env/environment.prod';
...
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
// Spies declarations
let spy_initI8nServiceMethod: jasmine.Spy;
let spy_debugLoggerAttr: jasmine.Spy;
let spy_enableProductionModeLoggerMethod: jasmine.Spy;
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot()],
declarations: [AppComponent],
providers: [I18nService]
});
TestBed.compileComponents();
fixture = TestBed.createComponent(AppComponent);
component = fixture.debugElement.componentInstance;
}));
beforeEach(inject([I18nService],
(_i18nService: I18nService) => {
i18nService = _i18nService;
// Create spies
// Spies
spy_initI8nServiceMethod = spyOn(I18nService.prototype, 'init');
spy_debugLoggerAttr = spyOn(Logger.prototype, 'debug');
spy_enableProductionModeLoggerMethod = spyOn(Logger, 'enableProductionMode');
}));
it('should component init on PRO environment',
async(() => {
spyOn(environment, 'isProduction').and.returnValue(environmentPRO.environment.isProduction);
spyOn(environment, 'defaultLanguage').and.returnValue(environmentPRO.environment.defaultLanguage);
spyOn(environment, 'supportedLanguages').and.returnValue(environmentPRO.environment.supportedLanguages);
component.ngOnInit();
expect(spy_enableProductionModeLoggerMethod).toHaveBeenCalledBefore(spy_debugLoggerAttr);
expect(spy_debugLoggerAttr).toHaveBeenCalledBefore(spy_initI8nServiceMethod);
expect(spy_initI8nServiceMethod).toHaveBeenCalledWith(environmentPRO.environment.defaultLanguage,
environmentPRO.environment.supportedLanguages);
}));
});

我的问题是我无法强制常量环境返回某些值,我都尝试了 spyOn 和 spyOnAttribute 以获得相同的结果。这是怎么回事?我可以尝试另一种方法吗?

我已经考虑过这个问题,我相信将配置文件保留为打字稿(将在执行时转换为 JavaScript(可能是安全漏洞,它看起来像这样,基于@mixth注释,无论如何都无法测试,所以我会遵循您的建议,我将使用可注入服务和 json 文件来存储设置。感谢您的见解和堆栈溢出的线程引用@mixth

最新更新