2017-04-08 71 views
0

我尝试创建与我的AppLoaderService匹配的虚假服务,以对我的Angular应用程序进行业力测试。如何使用Karma为角度测试创建假服务

我有一个服务,它处理装载程序在我的应用程序的可见性状态。它在组件中使用这种方式:

  • 主要成分订阅加载器的状态显示或不装载机
  • 子组件和其他服务可以触发emitChange功能在服务改变可见性状态

这里的服务:

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 

@Injectable() 
export class AppLoaderService { 
    private isLoaderVisible = new BehaviorSubject<boolean>(false); 

    changeLoaderState$ = this.isLoaderVisible.asObservable(); 

    emitChange(state: any) { 
    this.isLoaderVisible.next(state); 
    }  
} 

事实是这样的服务将随着时间的推移被球队改变。

我并不在意测试AppLoaderService的逻辑在组件测试级别“工作”的事实。我只希望能够在组件级别测试对服务的订阅(对于主要组件)并返回初始服务值,并且在组件生命中的某个时刻触发了该服务。

所以为了不依赖于服务本身,也许我可以存根此服务的话,在我的组件测试,可以使用该存根具有:

providers: [ 
    {provide: AppLoaderService, useClass: AppLoaderServiceStub} 
] 

但我很难界定一个适当的存根,而不用重写整个服务。

你有什么想法我可以做到这一点?特别是我的组件之一是订阅changeLoaderState$

+0

什么是你想实现 – Aravind

+0

创建一个假的服务,我来代替真正的一呼之不应依赖于inmy的业力部件测试 – BlackHoleGalaxy

+0

业务逻辑测试? – Aravind

回答

1

当存根需要实现公共API 时,被测组件关心的关键是存根。

在您的示例代码中,您需要在存根上使用emitChange(state: any)方法。如果你不关心它是否被调用,那么你可以将这个方法留空。

export class AppLoaderServiceStub { 

    emitChange(state: any) { 
    }  
} 

(我做的是对服务的可观察的属性只能使用你的Loader组件,而不是由您的应用程序的其他组件和服务的假设 - 如果这假设是错误的,你” d也必须存根该可观察性)。

编辑:

既然你需要的changeLoaderState $观察到的,那么存根以及 -

export class AppLoaderServiceStub { 

    changeLoaderState$ = Observable.of({ }) // or whatever dummy state value you want to use 
    emitChange(state: any) {}  
} 

注意Observable.of会散发出它的值,然后完成。如果你不想要完成事件触发,你可能需要Observable.never。如果我正确理解你的用法,我怀疑这个区别是否重要。

PS。不要忘了导入of操作:

import 'rxjs/add/observable/of'; 
+0

嗨,谢谢你的回答。我的主应用程序组件(负责显示加载器)订阅了'changeLoaderState $'。这是我无法在不重写整个服务的情况下存储的这部分内容... – BlackHoleGalaxy

+0

更新了附加代码示例的stubbing the observable – snorkpete

+0

谢谢,它比我没那么复杂。我认为我的大脑过于虚无。 – BlackHoleGalaxy