Jasmine - 将服务注入到由另一个组件提供的组件中

时间:2018-01-17 14:32:27

标签: angular service jasmine karma-runner code-injection

我正在使用Jasmine和Karma测试我的Angular5-App并遇到一个我无法解决的问题。

我编写了一个使用OpenLayers的映射构建器来创建地图。 以下是它的工作原理:

<map-builder [width]="800">
  <layer [name]="TestLayer">
     <marker [lat]="lat" [lng]="lng"><marker>
  </layer>
<map-builder>

MapBuilderComponent提供MappingService。所有子组件(如图层和标记)都使用此服务的相同实例。 MapBuilder在服务上调用initMap(options)函数来创建一个新的ol.Map()。 LayerComp和MarkerComp使用相同的服务向地图添加图层或特征。

我现在想在测试中创建一个MapBuilderComponent(带输入),测试它是否已定义(现在足够了),然后在第二个测试中创建一个LayerComponent(带输入)并测试是否定义了图层。所以我想对所有测试只使用一个mappingService实例。创建MapBuilderComponent后,mappingService应该有一个定义的映射(类型为ol.Map)。第二个测试需要此映射来添加图层。如何将服务(使用定义的映射)注入我的LayerComponent?

或者有更好的方法来测试吗?

一切顺利, Thalion

1 个答案:

答案 0 :(得分:1)

每个服务都是Angular中其类的单个实例。他们是单身人士,这就是你使用依赖注入的原因。

要在您的某个测试中获得服务,您可以使用测试平台,或将服务注入测试。

让我们看看试验台:

const service: MappingService = TestBed.get(MappingService);

这将为您提供服务的实例。

由于您正在测试组件,而不是此服务,因此您还应该为您的测试平台提供此服务的模拟。方法如下:

TestBed.configureTestingModule({
  imports: [/* modules */],
  declarations: [YourComponent],
  providers: [
    { provide: MappingService, useValue: myServiceMock }
  ]
})
  .compileComponents();

哪里

myServiceMock = {
  initMap: () => null, // return what you want here, preferably typed as the type returned by your function
};
相关问题