如何在Angular中对嵌套的订阅方法进行单元测试?

时间:2019-07-08 18:23:48

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

body {overflow:auto;}

这是场景。

要测试的东西:

  1. MethodToBeTested() { this.serviceA.methodA1().subscribe((response) => { if (response.Success) { this.serviceA.methodA2().subscribe((res) => { this.serviceB.methodB1(); }) } }); } 被呼叫。
  2. 如果响应。成功,然后检查是否调用了serviceA.methodA1().
  3. 检查serviceA.methodA2()收到值时是否调用了serviceB.methodB1()

首先,一个易于测试。

serviceA.methodA2()

但是一个测试2和3吗?

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

类似的东西?

2 个答案:

答案 0 :(得分: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...);

答案 1 :(得分:0)

好吧,所以我知道我要寻找的是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将会使用您在其中提供的数据。