Ошибка: ожидается один запрос соответствия критериям … не найдено

#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. Большое вам спасибо. Я бы не смог решить эту проблему без вашей помощи.