如何测试可观察流?

时间:2019-09-26 13:03:41

标签: angular unit-testing testing rxjs observable

我想在Angular中为以下功能编写单元测试:

exportToCsv(query: string) {
    this.exportToCsvService.exportDataAndGetCsv(query).pipe(
      first(),
      tap(response => this.fireCsvDownload(response))
    ).subscribe();
  }

函数exportDataAndGetCsv进行http调用并返回一个字符串。我认为我要编写的测试应该检查fireCsvDownload是否已执行。我尝试过:

it('should fire fireCsvDownload after exporting data and geting csv ', () => {
    component.exportToCsv(query);
    fixture.detectChanges();
    expect(component.fireCsvDownload).toHaveBeenCalled();
  });

但是我得到一个错误:Error: <toHaveBeenCalled> : Expected a spy, but got Function.我应该怎么办?我向exportToCsv提供了TestBed服务,而exportDataAndGetCsv返回了of('text').

1 个答案:

答案 0 :(得分:2)

创建一个在expect中替换的间谍:

it('should fire fireCsvDownload after exporting data and geting csv ', () => {

    const mySpy = spyOn(component, 'fireCsvDownload');
    component.exportToCsv(query);
    fixture.detectChanges();
    expect(mySpy).toHaveBeenCalled();
  });

您可能需要做:

const mySpy = spyOn(component, 'fireCsvDownload').and.callThrough();

但是我不确定是否需要自我测试。