angular - 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 文件来存储设置。感谢您的洞察力和stackoverflow的线程参考@mixth
推荐阅读
- laravel - 如何在 Laravel 中不使用 url 将变量传递给视图?
- python-3.x - 删除边界框点之间的网格点
- javascript - 节点获取连接 ETIMEDOUT 错误
- javascript - 在 Node 中获取 SQS retrieveMessages 解析
- python - Python 3.6.5 在 'tuple' 和 'str' 错误消息的实例之间返回 '<' not supported
- scala - scala specs2模拟http客户端响应
- excel - Excel 中的研究数据分析:列索引
- php - 计算在会议中注册的参与者数量(此集合实例上不存在属性 [participants])
- python - Python virtualenv 激活工作但解释器没有
- powerapps - 运行应用程序后表单字段不可见