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';