Я довольно новичок в Angular и Jasmine Framework. Я написал несколько API-сервисов, обертывающих HttpClient для выполнения вызовов get / post, и теперь я хочу протестировать метод get, чтобы убедиться, что он правильно перехватывает и выдает правильную ошибку.
Мой api.service.ts
выглядит так:
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient) { }
// simple wrapper to throw error
handleErrors(error: any) {
return throwError(error);
}
/**
* Method: get(url, { params })
*/
get(url: string, params: HttpParams = new HttpParams()): Observable<any> {
return this.http.get(url, { params })
.pipe(catchError(this.handleErrors));
}
}
Мой api.service.spec.ts
выглядит следующим образом:
import {TestBed, inject, async} from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
import {ApiService} from './api.service';
import {HttpClient, HttpErrorResponse, HttpParams} from "@angular/common/http";
import {of} from "rxjs";
describe('ApiService', () => {
beforeEach(() => TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [ApiService]
}));
afterEach(inject([HttpTestingController], (httpMock: HttpTestingController) => {
httpMock.verify();
}));
it('should be created', () => {
const service: ApiService = TestBed.get(ApiService);
expect(service).toBeTruthy();
});
it('should throw error properly',
async(
inject([HttpClient, ApiService], (http: HttpClient, apiService: ApiService) => {
const err = {status: 404, statusText: 'Not Found'};
spyOn(http, 'get').and.throwError(JSON.stringify(err))
apiService.get('testUrl');
expect(apiService.get).toThrow(JSON.stringify(err));
}
)
)
);
});
Поэтому, когда я запускаю тест, я получаю только одну строку сообщения:
Failed: {"status":404,"statusText":"Not Found"}
Кажется, выдает правильную ошибку, но тест не пройден. Я запутался здесь, как написать тест, чтобы знать, что он правильно генерирует ошибку, которая будет перехвачена и обработана handleErrors
, так что я знаю, что .pipe(catchError(this.handleErrors))
на самом деле работает?
Спасибо.