首页 > 解决方案 > 如何在 Angular 中对嵌套的订阅方法进行单元测试?

问题描述

MethodToBeTested() {
  this.serviceA.methodA1().subscribe((response) => {
   if (response.Success) {
     this.serviceA.methodA2().subscribe((res) => {
        this.serviceB.methodB1();
      })
    }
  });
}

这是场景。

要测试的东西:

  1. serviceA.methodA1().被称为。
  2. 如果 response.Success 然后检查是否serviceA.methodA2()被调用
  3. 检查是否在收到值serviceB.methodB1()时调用。serviceA.methodA2()

第一,易于测试。

let spy = spyOn(serviceA, 'methodA1');
expect(spy).toHaveBeenCalled();

但是一个测试2和3吗?

 let spy= spyOn(serviceA, 'methodA1').and.returnValue({subscribe: () => {success:true}});
subject.MethodToBeTested();

类似的东西?

标签: javascriptangulartypescriptunit-testingkarma-jasmine

解决方案


最好不要使用嵌套订阅。

这样的事情可能是一个解决方案:

let $obs1 = this.serviceA.methodA1().pipe(share());
let $obs2 = $obs1.pipe(switchMap(x => this.serviceA.methodA2()));

$obs1.subsribe(logic1 here...);
$obs2.subsribe(logic2 here...);

推荐阅读