You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:45:31