Angular 模拟具有用于测试的RxJS观测值的角度服务

Angular 模拟具有用于测试的RxJS观测值的角度服务,angular,unit-testing,typescript,karma-jasmine,sinon,Angular,Unit Testing,Typescript,Karma Jasmine,Sinon,我希望模拟我在Angular应用程序中构建的服务。我的服务如下: @Injectable() export class WizardDialogNavigationService { public navAction$: Observable<any>; public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null); constructor() { this.na

我希望模拟我在Angular应用程序中构建的服务。我的服务如下:

@Injectable()
export class WizardDialogNavigationService {

  public navAction$: Observable<any>;
  public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null);

  constructor() {
    this.navAction$ = this.navActionSubject.asObservable();
  }

  public navAction(action: string): void {
    this.navActionSubject.next(action);
  }
}
我需要模拟我的服务来测试我的组件,但是我用了错误的方法,例如,我创建了模拟服务,就像这样

class MockWizardDialogNavigationService {

public navAction$: Observable<any>;
public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null);
// this is wrong?
constructor() {
    this.navAction$ = this.navActionSubject.asObservable();
  }

  public navAction(action: string): void {
    // how do I mock a .next?
  }
}
然后添加一个存根,以便在调用navAction方法时监听:

stubWizardService = sinon.createStubInstance(WizardDialogNavigationService);
然而,我觉得这是错误的,我通常在模拟中声明navAction$observable,并且在运行测试时,我得到以下错误:

未捕获(承诺中):TypeError:undefined不是对象 (正在评估'this.wizardDialogNavigationService.navAction$.subscribe')


也许有人能解释一下我需要做什么来模拟服务和防止错误?如果我没有很好地解释自己或者需要更多的代码,请让我知道。我对测试知之甚少,正在努力学习。

模拟服务和服务调用很重要。您不想使用真正的promise,因为它处理异步,并且可能会失败。您可以将错误模拟为错误

这是一个如何模拟服务的示例

it('should mock videos', inject([VideoService], (videoService: VideoService) => { 
        videos = [
            { id: 0,  name: 'Superman' },
            { id: 1, name: 'Superman part 2' }
          ]
        spyOn(videoService, 'videos').and.returnValue(videos); 
        fixture.detectChanges();
        expect(component.getVideoOne()).toContain(Superman);

      });

在@jonsharpe的建议下,我发现了问题所在——我删除了模拟服务类,并创建了一个类似这样的存根实例

MockWizardDialogNavigationService = sinon.createStubInstance(WizardDialogNavigationService);
我将服务保存在提供者数组中

{provide: WizardDialogNavigationService, useValue: MockWizardDialogNavigationService},
那么我就这样声明navAction$

TestBed.compileComponents().then(() => {
// some code removed
        stubWizardService.navAction$ = Observable.empty();

}); 

一切正常

问同样的问题并删除它不太可能得到答案。Angular文档包括一个测试依赖于异步服务的组件的示例:请阅读指南。。。。
{provide: WizardDialogNavigationService, useValue: MockWizardDialogNavigationService},
TestBed.compileComponents().then(() => {
// some code removed
        stubWizardService.navAction$ = Observable.empty();

});