Angular 如何使用Karma为角度测试创建假服务
我试图创建一个与我的Angular 如何使用Karma为角度测试创建假服务,angular,typescript,Angular,Typescript,我试图创建一个与我的AppLoaderService匹配的假服务,用于对我的应用程序进行业力测试 我有一个服务来处理我的应用程序上的加载器可见性状态。它在组件中的使用方式如下: 主组件订阅加载程序的状态以显示或不显示加载程序 子组件和其他服务可以触发emitChange功能来更改服务的可见性状态 服务内容如下: import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Rx'; import {
AppLoaderService
匹配的假服务,用于对我的应用程序进行业力测试
我有一个服务来处理我的应用程序上的加载器可见性状态。它在组件中的使用方式如下:
- 主组件订阅加载程序的状态以显示或不显示加载程序
- 子组件和其他服务可以触发
功能来更改服务的可见性状态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);
}
}
但是我很难定义一个合适的存根而不重写整个服务。
你知道我怎样才能做到这一点吗?尤其是我的一个组件订阅了
changeLoaderState$
这一事实,存根创建时的关键点是存根需要实现受测组件关心的公共API
从示例代码中,您需要在存根上使用emitChange(state:any)
方法。如果您根本不关心它是否被调用,那么您可以将该方法保留为空体
export class AppLoaderServiceStub {
emitChange(state: any) {
}
}
(我假设服务上的observable属性只被你的加载器组件使用,而不是被你的应用程序的其他组件和服务使用——如果这个假设是错误的,你也必须将这个observable属性存根)
编辑:
因为您需要changeLoaderState$observable,所以也需要它-
export class AppLoaderServiceStub {
changeLoaderState$ = Observable.of({ }) // or whatever dummy state value you want to use
emitChange(state: any) {}
}
请注意,Observable.of
将发出其值,然后完成。如果您不希望触发完成事件,您可能希望可观察。永远不要。如果我正确理解你的用法,我怀疑区别是否重要
注意:不要忘记导入操作员的:
import 'rxjs/add/observable/of';
你想实现什么?创建一个假的服务,我可以调用它来代替真实的服务,而不是依赖于我的组件测试中的服务逻辑来进行因果报应测试?是的。我修改了这篇文章,因为它不清楚。嗨,谢谢你的回答。我的主要应用程序组件(负责显示加载程序)订阅了changeLoaderState$
。就是这一部分,我无法在不重写整个服务的情况下存根…更新了额外的代码示例,存根了ObservateThanks,它比我做的要简单得多。我觉得我的大脑走得太远了。
import 'rxjs/add/observable/of';