Как внедрить http в конструктор класса в модульном тестировании углового класса с использованием жасмина?
У меня есть абстрактный класс с именем logPublisher. Ниже приведен код:
export abstract class LogPublisher {
location: string;
abstract log(record: LogEntry): Observable<boolean>;
abstract clear(): Observable<boolean>;
}
Класс LogWebApi расширяет LogPublisher:
export class LogWebApi extends LogPublisher {
constructor(private http: Http) {
super();
this.location = "http://localhost:59143/api/v1/Log";
}
log(record: LogEntry): Observable<boolean> {
let ret: boolean = false;
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
let values: LogEntry[];
return this.http.post(this.location, record, options)
.map(response => response.json)
.catch(this.handleErrors);
}
clear(): Observable<boolean> {
//TODO: call webapi to clear all log entries
return Observable.of(true);
}
private handleErrors(error: any): Observable<any> {
console.log("Error while logging: " + error);
return Observable.throw(error);
}
}
Теперь в моем модульном тесте для класса LogWebApi, как я буду вводить "http"? Я пишу модульные тесты с использованием жасмина.
Любой фрагмент кода будет полезен.
Заранее спасибо.
1 ответ
Ты можешь использовать HttpClientTestingModule
а также HttpTestingController
при тестировании сервисов, которые имеют HttpClient
как зависимость. Вы можете найти объяснение бога в официальной угловой документации в разделе " Проверка Http-запроса ".
import {TestBed} from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import { LogWebApi } from 'path-to-your-service';
describe('ChannelRecsService tests', () => {
let service: LogWebApi;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [LogWebApi]
});
service = TestBed.get(LogWebApi);
httpMock = TestBed.get(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
describe('#log tests', () => {
it('Shpould make a http POST request to the given url', () => {
const logrecord = {put the object you want to pass in here};
const mockResponse = //create a mock response object;
service.log(logrecord).subscribe((res) => {
expect(res).toEqual(mockResponse);
});
const req = httpMock.expectOne('http://localhost:59143/api/v1/Log');
expect(req.request.method).toBe('POST');
req.flush(mockResponse);
});
});
});