Angular 9 单元测试 属性 'of' 在类型 'typeof Observable' 上不存在

Angular 9 unit test Property 'of' does not exist on type 'typeof Observable'

我正在编写单元测试用例并试图监视服务函数,但在将数组转换为可观察对象时遇到了困难我在堆栈溢出上尝试了类似的问题,但没有任何效果。请帮助我如何调用服务功能

我正在研究最新版本的 angular 和 ngrx

我试过的选项

1)

spyOn(service, 'getData').and.returnValue(Observable.of(data));

2) 这个没有覆盖单元测试组件中的订阅部分

spyOn(service, 'getData').and.returnValue(of(data));

整个代码:测试用例从不进入 this.dataService.getState()

的订阅部分

// component:

getState(){
    this.dataService.getState().subscribe(s => s.forEach(element => {
      this.data.push(element.name);
    }));
}
  
//test case

beforeEach(() => {
    fixture = TestBed.createComponent(DataComponent);
    component = fixture.componentInstance;
    service = TestBed.inject(DataService);
    fixture.detectChanges();
  });
  
it('should call get data Function', () => {
    spyOn(service, 'getData').and.returnValue(of(data));
  });

你是 运行 fixture.detectChanges() 内在你是 beforeEach 就是问题所在。 在你调用 detectChanges 的那一刻你的组件被初始化,所以修改代码如下

beforeEach(() => {
    fixture = TestBed.createComponent(DataComponent);
    component = fixture.componentInstance;
    service = TestBed.inject(DataService);

  });

it('should call get data Function', () => {
    spyOn(service, 'getData').and.returnValue(of(data));
    fixture.detectChanges();
  });

设置测试时,组件会在您调用 fixture.detectChanges 时实例化。由于实例化会调用生命周期挂钩,因此 ngOnInit 函数中的任何代码都会在您的第一个测试规范之前执行。

如果 data 是常数,则执行:

  beforeEach(() => {
    fixture = TestBed.createComponent(DataComponent);
    component = fixture.componentInstance;
    service = TestBed.get(DataService);
    spyOn(service, 'getData').and.returnValue(of(data));
    fixture.detectChanges();
  });

如果data是一个变量,做:

  beforeEach(() => {
    fixture = TestBed.createComponent(DataComponent);
    component = fixture.componentInstance;
    service = TestBed.get(DataService);
  });

//测试方法

it('should call get data Function', () => {
    spyOn(service, 'getData').and.returnValue(of(data));
    // other required setup
    fixture.detectChanges();
    // test stuff
  });