Как отлаживать "Ожидается один соответствующий запрос для URL-адреса соответствия критерию: не найдено ни одного"

В моем приложении Angular я тестирую свой сервис, который использует HttpClient, как это предлагает официальная документация:

https://angular.io/guide/http#testing-http-requests

Вот как выглядит мой тестовый пример:

it('myMethod() should correctly sent the http request', () => {
  const mockResultData = { result: 123 };

  service.myMethod(); // will trigger an http request using the httpClient

  const req = httpTestingController.expectOne('/some/path?param1=a&param2=b');

  expect(req.request.method).toEqual('GET');

  req.flush(mockResultData);

  httpTestingController.verify();
});

Однако тест не проходит в следующих случаях:

Ошибка: ожидался один соответствующий запрос для критерия «URL-адрес соответствия: / some / path? Param1 = a & param2 = b», но не обнаружен.

Теперь мне совершенно ясно, что инициированный запрос не имеет точно URL-адреса /some/path?param1=a&param2=b, однако в сообщении об ошибке не упоминается, какие запросы были найдены вместо этого.

Как я могу отладить это и проверить, какие запросы действительно были найдены?


person Francesco Borzi    schedule 29.10.2019    source источник


Ответы (1)


Хитрость заключается в том, чтобы запустить тот же тест без expectOne, поэтому просто запустите HTTP-запрос с помощью service.myMethod(), а затем вызовите httpTestingController.verify():

it('myMethod() should correctly sent the http request', () => {
  const mockResultData = { result: 123 };

  service.myMethod(); // will trigger an http request using the httpClient

  // TEMPORARILY COMMENT THESE 3 LINES

  // const req = httpTestingController.expectOne('/some/path?param1=a&param2=b');

  // expect(req.request.method).toEqual('GET');

  // req.flush(mockResultData);

  httpTestingController.verify();
});

Таким образом, метод httpTestingController.verify() проверит, что нет ожидающих запросов, и в противном случае вызовет ошибку. Итак, поскольку действительно есть ожидающий запрос, теперь он выдает ошибку:

Ошибка: не ожидалось никаких открытых запросов, найдено 1: GET / some / path? Param2 = b & param1 = a

это именно то, что мне было нужно: знать, что было на самом деле запросом.

Итак, в моем случае проблема заключалась в параметрах, которые были поменяны местами (param2=b и param1=a). Итак, я наконец смог исправить свой тестовый пример:

it('myMethod() should correctly sent the http request', () => {
  const mockResultData = { result: 123 };

  service.myMethod(); // will trigger an http request using the httpClient

  const req = httpTestingController.expectOne('/some/path?param2=b&param1=a'); // now the params are in the right order

  expect(req.request.method).toEqual('GET');

  req.flush(mockResultData);

  httpTestingController.verify();
});
person Francesco Borzi    schedule 29.10.2019