#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 — й просто отлично сработал. Спасибо, Эли.