Модульное тестирование функции с возвращаемым значением в подписке - PullRequest
0 голосов
/ 07 мая 2020

У меня есть функция для модульного тестирования, к которой я не знаю, как подойти. Упрощенно:

someFunction(): boolean {
 this.service.login().subscribe(response => {
  if (response) {
    return someOtherFunction();
  }
 });
}

someOtherFunction(): boolean {
 this.service.otherTask().subscribe(response => {
  if (response) {
    return true;
  }
 });
}

Я хочу проверить результат someFunction в этом случае. Однако это не работает:

describe('someFunction', () => {
  it('returns true', () => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   result = component.someFunction();
   expect(result).toEqual(true);
 });
});

ServiceSpy был настроен до этого блока. Я вижу, что функции выполняются и возвращается истина. Однако на данный момент я прошу result, но он все еще не определен. Фреймворк тестирования не ждет, пока все будет завершено. Я пытался использовать asyn c, fakeAsyn c, done (), но это не помогло. Есть ли способ проверить возвращаемое значение someFunction?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Проблема в функциях, они возвращают результат внутри subscribe, это не сработает, вам нужно вернуть наблюдаемое или использовать локальные переменные.

someFunction(): Observable<boolean> {
 return this.service.login().pipe(
   first(),
   switchMap(res => res ? this.someOtherFunction() : of(undefined)),
 );
}

someOtherFunction(): Observable<boolean> {
 return this.service.otherTask().pipe(
   first(),
   map(response => !!response),
 );
}

, а затем в ваш тест вы можете сделать

describe('someFunction', (done) => {
  it('returns true', () => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   component.someFunction().subscribe(result => {
     expect(result).toEqual(true);
     done();
   });
 });
});
0 голосов
/ 07 мая 2020

Вдохновленный ответом @satanTime, комментариями и еще некоторыми rnet поиском, я отредактировал свой код и протестировал его следующим образом. Похоже, что для someOtherFunction подписка не была проблемой, поэтому я пропустил ее в упрощении.

someFunction(): Observable<boolean> {
 return this.service.login().pipe(map(response => {
  if (response) {
    return someOtherFunction();
  }
 }));
}

someOtherFunction(): boolean {
    return true;
}

Тест:

describe('someFunction', () => {
  it('returns true', (done) => {
   serviceSpy.login.and.returnValue(of({response: response}));
   serviceSpy.otherTask.and.returnValue(of({response: otherResponse}));
   component.someFunction().subscribe(result => {
   expect(result).toEqual(true);
   done();
   });
 });
});
...