Angular 如何在单元测试中导入模拟环境文件
在angular应用程序中,我们使用环境文件加载一些配置文件 环境科技Angular 如何在单元测试中导入模拟环境文件,angular,jasmine,Angular,Jasmine,在angular应用程序中,我们使用环境文件加载一些配置文件 环境科技 export const environment = { production: false, defaultLocale: 'en_US', }; 然后,我们将其用于我们的一项服务: import { environment } from '../../environments/environment'; import { TranslateService } from './translate.service'
export const environment = {
production: false,
defaultLocale: 'en_US',
};
然后,我们将其用于我们的一项服务:
import { environment } from '../../environments/environment';
import { TranslateService } from './translate.service';
@Injectable()
export class LocaleService {
constructor(private translateService: TranslateService){}
useDefaultLocaleAsLang(): void {
const defaultLocale = environment.defaultLocale;
this.translateService.setUsedLang(defaultLocale);
}
}
因此,我在服务方法中使用环境文件中的值
在我们的测试文件中,我们当然可以监视translateService:
translateService=jasmine.createSpyObj('translateService',['setUsedLang'])代码>
但是我不知道如何在我的测试文件中模拟环境值(例如,在每个之前的中)。甚至为了测试的目的,将其转换为主题
,这样我就可以更改它并测试不同的行为
更一般地说,如何在测试中模拟此类导入值以确保不使用实际值 您不能测试/模拟环境.ts
。它不是Angular的DI系统的一部分,它是对文件系统上文件的硬依赖。Angular的编译过程使您能够在构建时交换不同的环境。*.ts
文件
Angular的DI系统是一种典型的面向对象方法,用于使应用程序的某些部分更易于测试和配置
我的建议是利用DI系统,并尽量少用类似的东西
相反,对于Angular希望您从中抽象出来的任何依赖项,请执行相同的操作。创建一个服务,在environment.ts
数据和应用程序块之间提供接缝
它不需要任何逻辑,它可以直接通过环境的属性
(因此它不需要自己测试)
然后更新依赖于environment.ts
的服务/组件,并用服务替换该依赖关系。在测试时,您可以模拟它,从environment.ts
之外的其他地方获取数据。在这种情况下,我使用的一种技术是创建包装服务,例如EnvironmentService.ts
,在这种情况下,它返回环境配置
这允许我模拟对EnvironmentService
的getEnvironmentConfiguration
方法的调用,就像任何其他spyOn
调用一样
这样就可以在单元测试中修改环境变量:)类似的东西对我很有用:
it('should ...', () => {
environment.defaultLocale = <location-to-test>; // e.g. 'en'
const result = service.method();
expect(result).toEqual(<expected-result>);
});
it('should…',()=>{
environment.defaultLocale=;//例如'en'
const result=service.method();
期望(结果);
});
将环境包装在一个加载它的接口中(EnvironmentLoader
)并模拟它?是的,我可以,但是如何测试EnvironmentLoader类和方法?问题是移动的,但不是固定的。我认为这种方法的问题在于它改变了全局变量,因此它可能会与其他需要不同值的测试冲突,以便work@AlejandroBarone说得好。也许可以选择在afterEach中将environment.defaultLocale重置回原始值。
it('should ...', () => {
environment.defaultLocale = <location-to-test>; // e.g. 'en'
const result = service.method();
expect(result).toEqual(<expected-result>);
});