Angular嵌套Observable与forkJoin测试异常问题排查
问题排查:测试中next回调无法触发但组件正常的原因
编辑补充
OtherService的模拟实现存在时序相关问题。
我想排查测试文件中导致其与组件表现不一致的问题:测试中的next:回调始终无法触发,但相同逻辑在组件中完全正常。
核心需求是理解问题成因,而非重构服务代码。
服务代码
@Injectable({ providedIn: 'root' }) export class MyService { strings = ["a","b","c"] method():Observable<string> { const subject = new Subject<string>(); let observableArray: Array<Observable<string>> = []; strings.forEach((data: strings) => { observableArray.push( this._otherService .returnsAnotherObservable() .pipe( tap({ next: () => { console.log("next") // 测试与组件中均正常输出 subject.next(data); }, }) ) ) }); forkJoin(observableArray) .pipe(tap(() => subject.complete())) .subscribe(); return subject; } }
组件代码
... ngOnInit(): void { this._myService .method() .subscribe({ next: (value: string) => { console.log(string) // 此处正常输出 }, complete: () => { console.log("end") } }); }
测试代码
Class MockOtherService{ returnsAnotherObservable():Observable<any> { // return of(true) 因非异步无法正常工作 return of(true).pipe(delay(1000)) // 修改后可正常运行 } } describe('MyService', () => { let service: MyService; beforeEach(async () => { TestBed.configureTestingModule({ providers: [{provide: OtherService, useClass: MockOtherService }], imports: [AppModule] }); service = TestBed.inject(MyService); }); it("should work", () => { servie.method() .subscribe({ next: (value: string) => { console.log("value", value) // 此处从未触发 }, complete: () => { console.log("end") // 直接触发此处 } }); }); });
我已尝试使用fakeAsync与tick(),也将forkJoin替换为zip,但均无效果。
唯一有效的尝试是将Subject()替换为BehaviorSubject(),这让我猜测next()调用发生在测试订阅之前,但组件中同样的逻辑却能正常运行。
感谢帮助
内容的提问来源于stack exchange,提问作者addUsername
相关产品推荐
相关产品推荐

