我正在尝试测试这个方法:
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 进行测试的解决方案?
问题在于变量
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()
});
});