单元测试:CombineLatest - 添加 SetTimeOut 后测试成功

问题描述 投票:0回答:1

我正在尝试测试这个方法:

myMethod() {
      result$ = combineLatest([observableOne$,observableTwo$]);
       result$.subscribe(([one, two]) => {
            this.result = one || two;
        });
    }
ngAfterViewInit() {
        this.myMethod();
    }

但是每次测试失败:

  it('should test my method', (): void => {
            cmp.result$ = of([true, false]);
            cmp.ngAfterViewInit();
                expect(cmp.result).toBe(true);
        });

当我添加 setTimeOut 时,一切都按预期工作

  it('should test my method', (): void => {
            cmp.result$ = of([true, false]);
            cmp.ngAfterViewInit();
            setTimeout(() => {
                expect(cmp.result).toBe(true);
            },1000)
        });

是否有不使用 SetTimeOut 进行测试的解决方案?

angular unit-testing rxjs karma-jasmine combinelatest
1个回答
0
投票

问题在于变量

cmp.result
赋值的时机。

在第一个版本中,测试将在

cmp.result
产生之前读取
result$.subscribe(

第二个版本有点 hackie,但它可以在

result$.subscribe(
产生后运行测试。

你可以改变你的组件逻辑来满足异步事件,在它的主体上有一个地图函数:

realResult$ = combineLatest([observableOne$,observableTwo$]).pipe(map(([one, two]) => one || two));

那么你的测试就可以做到这一点:

it('should test my method', (done): void => {
  cmp.observableOne$ = of(true);
  cmp.observableTwo$ = of(false);
  cmp.realResult$.subscribe(result => {
    expect(result).toBe(true);
    done()
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.