【问题标题】:How to unit test nested subscribe methods in Angular?如何在 Angular 中对嵌套的订阅方法进行单元测试?
【发布时间】:2019-07-08 18:23:48
【问题描述】:
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();

类似的东西?

【问题讨论】:

    标签: javascript angular typescript unit-testing karma-jasmine


    【解决方案1】:

    最好不要使用嵌套订阅。

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

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

    【讨论】:

    • 比方说,这是别人的现有代码。而且我无法更改代码。但我必须编写测试。
    【解决方案2】:

    好的,所以我发现我要找的是callFake

    it('should test inside of subscribe', () => {
        let spy = spyOn(serviceA, 'methodA1').and.callFake(() => {
          return of({ success: true });
        });
        let spy2 = spyOn(serviceA, 'methodA2').and.callFake(() => {
          return of({ success: true });
        });
        let spy3 = spyOn(serviceB, 'methodB1').and.returnValue(of({ success: true }));
         subject.MethodToBeTested();
        expect(spy3).toHaveBeenCalled();
      });
    

    我了解到returnValue 不会实际执行订阅的内部,而callFake 将使用您在其中提供的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多