Ваш сервис не должен подписываться на наблюдаемый HttpClient и, следовательно, он не должен быть методом возвращаемого типа void.Службы должны возвращать HttpClient, наблюдаемый для подписки.
Например
Метод обслуживания
@Injectable({ providedIn: 'root' }) //ensure service is provided at root level so it remains a singleton in the dependency injection tree.
...
constructor(http: HttpClient){}
...
processData(id): Observable<any> { //services should return an Observable
const url = `http://localhost:5000/data/${id}`;
return this.http.head(url); // ** your service method SHOULDN'T be subscribing to the HTTP call.
}
Ваш метод обслуживания не должен подписываться на вызов HTTP.Вызов .subscribe () приведет к выполнению HTTP-запроса.
Компонент, использующий этот сервис, сначала внедрит сервис в конструктор.Затем вы подпишетесь на сервисный вызов в компоненте.
SomeComponent.ts
...
constructor(private dataService: DataService){}
...
someMethod(){
this.processData().subscribe(
(response) => { //subs
console.log("success");
// Rest of the code - TODO
},
(error) => {
console.log('Failed');
// Rest of the code - TODO
}
)
}
ВашПосле этого тестовый набор должен подписаться на услугу, как компонент.
service.spec.ts - тестовый набор вашего сервиса
fit('should be valid', fakeAsync(() => {
const id = 1;
service.subscribe( //you are making the http call in the test case.
(success: any) => {
expect(success.request.headers.get('Content-Type').toEqual('application/json')); //assert that the http headers you will get back from the observable is similar to the one the mock backend will return.
}
)
httpMock.expectOne({
url: 'http://localhost:5000/data/${id}',
method: 'HEAD'
}).flush({}, { headers: { 'Content-Type': 'application/json' } }); //HEAD requests have empty response body but only headers
});
Кроме того, вам не следует вызывать localhost, когда вам нужно развернуть это приложение на веб-сервере, вам придется вручную изменять каждую строку.
Вместо этого вы должны устанавливать свои URL-адреса API в средах.файл, который находится в:
. Затем вы должны импортировать URL среды в виде строк следующим образом:
import { environment } from 'environments/environment';
...
const API_URL = environment.apiURL;
Вот несколько руководств, которые мне помогли, и я поставил в закладки: Использование модуля angtt HttpClient для отправки HTTP-запросов: https://www.techiediaries.com/angular-httpclient/
Службы тестирования: https://www.ng -conf.орг / 2019 / HttpClient-углы главного тестирование глубина /