Насмешка над HttpClient в пользовательском API-сервисе с кэшированием - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь написать несколько тестов в Жасмине, и я хотел издеваться над HttpClient в своем пользовательском API-сервисе, но получаю ошибку.В частности, я думаю, что это из-за того, как я написал свой сервис API.Я вызываю конечную точку, а затем кеширую результат в теме поведения.Я возвращаю тему поведения вместо наблюдаемого http-запроса.

Вот мой сервисный код:

getData(binnum, xaxis, yaxis, numLines, selectionId, zoom = false) {
   let key = "x" + xaxis + "y" + yaxis + "bin" + binnum + "lines" + numLines;

   let cachedItem = this.cache[key];
   if (cachedItem != null) {
     console.log("cached item");
     return cachedItem.bs;
   }

   let bs = new BehaviorSubject<any>(null);
   this.binCache[key] = { bs: bs, ts: new Date().getTime() };

   let url = environment.apiEndpoint + 'bins?binnum=' + binnum + '&xaxis=' + xaxis + '&yaxis=' + yaxis;

   let obsv = this.http.get(url);
   obsv.subscribe((data: Array<any>) => {
     bs.next(data);
   })
   return bs;
 }

Вот мой тестовый код:

it(`should issue a request`,
   async(
      inject([CustomDataService, HttpTestingController], (service: CustomDataService, backend: HttpTestingController) => {
         service.getData(200, 1, 2, 100, 0, false).subscribe();
         backend.expectOne({
            method: 'GET'
         });
      })
   )
 );

Я получаю ошибку: Ожидается один соответствующий запрос критериев"Метод сопоставления: GET, URL: (любой)", не найден.

Если я проверяю только HttpClient, он работает:

it(`should issue a request`,
   async(
      inject([HttpClient, HttpTestingController], (http: HttpClient, backend: HttpTestingController) => {
         http.get('/foo/bar').subscribe();
         backend.expectOne({
            method: 'GET'
         });
      })
   )
 );

Как смоделировать запрос httpв моем CustomDataService?Нужно ли отделять службу API от кода кэширования?

1 Ответ

0 голосов
/ 06 июня 2019

Выше было рекомендовано провести рефакторинг моего кода, чтобы использовать службу кэширования и HttpInterceptor для управления им.К сожалению, мне нужно кэшировать только определенные вызовы API, и перехватчики перехватывают все.Я не хотел писать код проверки маршрутов в перехватчике.

Мое оригинальное решение было смоделировано после чего-то вроде this .Поэтому в своем решении я извлек вызов API в его собственный сервис, который использует моя функция getData (), описанная выше.Теперь я могу издеваться над HttpClient.

Я новичок в тестировании на Angular, но нашел ответ на то, что я изначально хотел: способ сделать мой вызов бэкэнду и вернуть пользовательские данные.Вот тест, который я написал:

it('Mocking a call to the backend', () => {

 // spyOn lets you mock a function call return a mock data
 spyOn(myService, 'getData').and.returnValue(of({ test: 2 }));
 renderManager.calculateThings(myService);

 // Check that it was called
 expect(myService.getData).toHaveBeenCalled();

});

Я знаю, что немного странно проходить через службу API через функцию, но мой сценарий оправдал это.

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