#angular #unit-testing #http #jasmine
#angular #модульное тестирование #http #жасмин
Вопрос:
Я видел много вопросов об этой ошибке, но, проведя большую часть сегодняшнего дня, пробуя каждое решение, мне нужна ваша помощь.
Я пытаюсь протестировать эту службу, которая является запросом http get
getTrainInformation(url: string): Observable<any> {
return this.http.get(url,
{
params:
{
expand: 'true'
}
}
).pipe(catchError(this.handleError));
}
Вот мой тест:
import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { TrainInformationService } from "./traininformation.service";
describe('traininformation service', () => {
let service: TrainInformationService;
let httpTestingController: HttpTestingController;
beforeEach( () => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [TrainInformationService]
});
service = TestBed.get(TrainInformationService);
httpTestingController = TestBed.get(HttpTestingController);
});
it('should perform a GET', () => {
const url = service.getFullUrl('BOP');
const urlParam = { param: 'expand', value: 'true'};
const urlWithParams = `${url}?${urlParam.param}=${urlParam.value}`;
service.getTrainInformation(urlWithParams).subscribe();
const req = httpTestingController.expectOne(urlWithParams);
console.log('req is ' req);
req.flush('Some');
// httpTestingController.verify();
});
});
При выполнении теста он завершается с ошибкой:
Ошибка: ожидается один запрос соответствия критериям «Соответствует URL: <<the_expected_url>>, не найдено.
Если я изменю тест так, чтобы я комментировал вызовы expectOne и flush и вызывал verify , поэтому тест становится:
it('should perform a GET', () => {
const url = service.getFullUrl('BOP');
const urlParam = { param: 'expand', value: 'true'};
const urlWithParams = `${url}?${urlParam.param}=${urlParam.value}`;
service.getTrainInformation(urlWithParams).subscribe();
// const req = httpTestingController.expectOne(urlWithParams);
// console.log('req is ' req);
// req.flush('Some');
httpTestingController.verify();
});
Ошибка, которую я сейчас вижу,:
Ошибка: не ожидается открытых запросов, найдено 1: GET <<the_expected_url>>
Что я делаю не так?
Ответ №1:
Я не думаю, что вы делаете что-то не так. Я столкнулся с той же проблемой, что и вы, когда я не мог получить дескриптор запроса, и это происходит, скорее всего, потому, что запрос имеет параметры, и мы не можем сопоставить его по параметрам, хотя URL-адрес кажется один к одному. Если параметров нет, я могу легко получить дескриптор запроса.
Чтобы получить дескриптор запроса с параметрами, я использую другую подпись httpTestingController.expectOne
того, куда я передаю объект с соответствующими критериями.
afterEach(() => {
httpTestingController.verify();
});
it('should perform a GET', () => {
const url = service.getFullUrl('BOP');
const urlParam = { param: 'expand', value: 'true'};
const urlWithParams = `${url}?${urlParam.param}=${urlParam.value}`;
service.getTrainInformation(urlWithParams).subscribe(response => {
expect(response).toBe('Some'); // put an assertion here (optional).
});
const req = httpTestingController.expectOne({
method: 'GET', // find open Http request that is a get request.
});
console.log('req is ' req); // should have a handle on it now
// below asserts the params
expect(req.request.params.toString()).toBe('${urlParam.param}=${urlParam.value}');
req.flush('Some');
});
Комментарии:
1. Большое вам спасибо. Я бы не смог решить эту проблему без вашей помощи.