Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何在单元测试中导入模拟环境文件_Angular_Jasmine - Fatal编程技术网

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'

在angular应用程序中,我们使用环境文件加载一些配置文件

环境科技

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>);
});