Модульный тест с угловой записью для switchMap

#angular #jasmine

#угловой #жасмин

Вопрос:

ниже приведены два моих метода обслуживания

 getCountries(offset: number) {  let url = this.configManagerService.countriesApiUrl;  const httpHeaders = this.getHeaders();  return this.httpClient.get(url   offset, { headers: httpHeaders });  }    getAllCountries(offset: number = 0, resultOld: any[] = []) {  return this.getCountries(offset).pipe(    //not getting covered  switchMap((result: any) =gt; {  offset = result.length gt; 0 ? offset   result.length : -1;  return offset gt;= 0  ? this.getAllCountries(offset, [...resultOld, ...result])  : of(resultOld);  //not getting covered    })  );  }  

Я смог написать модульный тестовый случай, который охватывал getCountries функцию, но не смог понять, как я могу охватить код, о котором я упоминал в комментариях switchMap . Попытался погуглить, но не смог найти ничего, что соответствовало бы моим требованиям. Любая помощь здесь была бы очень признательна. Спасибо.

Ответ №1:

Вот пример одного случая.

 it('returns resultOld if result length is zero', (done: DoneFn) =gt; {  const resultOld = [];  spyOn(service, 'getCountries').and.returnValue(of(resultOld));  service.getAllCountries(2, resultOld).subscribe(results =gt; {  expect(results.length).toBe(0);  done();  }); });  it('calls getAllCountries over and over until converge', (done: DoneFn) =gt; {  const resultOld = [{ name: 'USA' }];  spyOn(service, 'getCountries').and.returnValue(of(resultOld));  service.getAllCountries(-1, resultOld).subscribe(results =gt; {  expect(results.length).toBe(1);  done();  }); });  

Комментарии:

1. Привет, Али, я попробовал это, но получил ошибку «ПРЕДУПРЕЖДЕНИЕ: ошибка диапазона: превышен максимальный размер стека вызовов». Я не уверен, в чем заключается эта ошибка.

2. Эй, Вамси, извини за это, я неправильно прочитал. Кажется, что у вас есть стековый поток, который getAllCountries вызывает себя снова и снова. Я изменил тест, чтобы вернуть пустой массив. Я также добавил тест для вашего 2-го сценария. Мне трудно рассуждать об этом, потому что я не знаю, что такое смещение, но я надеюсь, что этот комментарий поможет вам.

3. Привет, Али, я все еще получаю ту же ошибку. Можем ли мы разорвать цикл после первой итерации?

4. Я только что удалил 2-й тестовый случай, это вызывает ошибку. 1 — й просто отлично сработал. Спасибо, Эли.