Как тестировать вложенные методы подписки в Angular? - PullRequest
0 голосов
/ 08 июля 2019
MethodToBeTested() {
  this.serviceA.methodA1().subscribe((response) => {
   if (response.Success) {
     this.serviceA.methodA2().subscribe((res) => {
        this.serviceB.methodB1();
      })
    }
  });
}

Вот сценарий.

Вещи для проверки:

  1. serviceA.methodA1()..
  2. если ответ. Успех, затем проверьте, если 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();

что-то подобное?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Было бы лучше не использовать вложенную подписку.

Что-то вроде этого может быть решением:

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

$obs1.subsribe(logic1 here...);
$obs2.subsribe(logic2 here...);
0 голосов
/ 09 июля 2019

Хорошо, поэтому я понял, что я ищу, это 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 будет с данными, которые вы предоставляете внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...