На прошлой неделе я обновил наше приложение с Angular 5.8 до 6. С этим я изменил использование HttpModule и Http на использование HttpClientModule и HttpClient.Пока все хорошо, интерфейс работает, как и ожидалось.Только сейчас некоторые сервисные тесты не проходят, и я пытаюсь их исправить.В основном у меня есть два типа сервисов:
Сервис, который напрямую использует HttpClient.
CustomService:
import { HttpClient } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { map } from "rxjs/operators";
import { Observable} from "rxjs";
@Injectable()
export class CustomService {
constructor(private readonly http: HttpClient) { }
someMethod(): Observable<boolean> {
return this.http.get("api/some-url").pipe(
map(res => <boolean>res) }))
);
}
}
Сервис, который использует ServiceHelper, который использует HttpClient.
CustomService:
import { HttpHeaders } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
import { SomeRequest } from "../Models/SomeRequest";
import { SomeResult } from "../Models/SomeResult";
import { ServiceHelper } from "./../Helpers/servicehelper";
@Injectable()
export class CustomService {
constructor(readonly serviceHelper: ServiceHelper) { }
someMethod(): Observable<SomeResult> {
const request = {} as SomeRequest;
const headers = new HttpHeaders({ "Content-Type": "application/json" });
const options = { headers: headers };
return this.serviceHelper
.post<SomeRequest, SomeResult>("api/some-url", request, options);
}
}
ServiceHelper:
import { HttpClient } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { map } from "rxjs/operators";
import { Observable } from "rxjs";
import { Result } from "../Models/Result";
@Injectable()
export class ServiceHelper {
constructor(readonly http: HttpClient) { }
post<Req, Res extends Result>(url: string, request: Req, options): Observable<Res> {
return this.http.post(url, request, options).pipe(
map(data => (data as any) as Res)
);
}
}
Тесты дляпервый сервис уже работает снова, выполнив что-то вроде этого:
import { TestBed } from "@angular/core/testing";
import { HttpClientTestingModule, HttpTestingController } from "@angular/common/http/testing";
import { HttpResponse } from "@angular/common/http";
import { CustomService } from "./custom.service";
describe("service tests", () => {
let service: CustomService;
let httpClient: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [CustomService]
});
service = TestBed.get(CustomService);
httpClient = TestBed.get(HttpTestingController);
});
it("should pass", () => {
service.someMethod().subscribe(result => {
expect(result).toBe(true);
});
httpClient.expectOne("api/some-url").event(
new HttpResponse<boolean>({ body: true }));
});
});
Для второго сервиса (который использует ServiceHelper) я хочу сделать что-то подобное выше в выражении beforeEach.Я попробовал несколько вещей в configureTestingModule с добавлением провайдеров и / или импортов, но в основном я получаю StaticInjectorError после запуска тестов.
Как я могу написать тесты для второго типа сервисов?Надеюсь, кто-то может помочь мне дальше!