HttpTestingController.expectOne не видит мой запрос, но он открыт в методе afterEach () - PullRequest
0 голосов
/ 25 октября 2019

Я пишу модульный тест для тестирования моего сервиса, который вызывает rest API. Ожидается, что ожидаемому () не удается найти мой запрос: Ожидается один соответствующий запрос по критериям "Соответствующий URL: http://localhost:5000/api/v1.0/stat/estimation-graph", не найден.

Я пробовал разные перегрузки ожидаемой операции, такие,as:

httpMock.expectOne(url)
httpMock.expectOne({method: 'GET', url: url})
httpMock.expectOne(res => res.method === 'GET' && res.url === url)

Кроме того, я попытался изменить URL, чтобы он содержал параметры ('http://localhost:5000/api/v1.0/stat/estimation-graph?battleCount=100&winCount=50'), но безуспешно.

Наконец, я открыл консоль Chrome с помощью KarmaРезультаты теста, и я обнаружил, что мой API не может быть вызван из-за политики CORS. Я также исправил это.

Мой файл .spec.ts:


// imports..

describe('StatProviderService', () => {
    let injector: Injector;
    let httpMock: HttpTestingController;
    let statService: StatProviderService;
    beforeEach(() => 
    {
        injector = TestBed.configureTestingModule({
            imports: [
                HttpClientModule,
                HttpClientTestingModule,
            ],
            providers: [
                StatProviderService,
            ],
        });
        httpMock = injector.get(HttpTestingController);
        statService = injector.get(StatProviderService);
    });

    afterEach(() => {
        httpMock.verify();
    });

    it('should work', () => {
        let response;
        let url = 'http://localhost:5000/api/v1.0/stat/estimation-graph';

        statService.getEstimationGraphData( 100, 50 )
          .subscribe(res => {
            response = res;
          });

        const req = httpMock.expectOne(url);
        req.flush(response);
    });
});

Мой класс обслуживания:


// imports...

@Injectable({
    providedIn: 'root'
})
export class StatProviderService {
    // private variables

    constructor(
        private http: HttpClient
    ) { }

    private baseApiUrl(endpoint?: string) {
        return `${this.env.apiUrl}/${this.apiVer}/${endpoint}`;
    }

    getEstimationGraphData(battlecount: number, winCount: number): Observable<IEstimationGraphPoint[]> {
        return this.http.get<IEstimationGraphPoint[]>(`${this.baseApiUrl(this.graphDataEndpoint)}/?battleCount=${battlecount}&winCount=${winCount}`);
    }
}

Окно результатов Кармы сообщает мне, что не может найти открытый запрос:

Error: Expected one matching request for criteria "Match URL: http://localhost:5000/api/v1.0/stat/estimation-graph", found none.

Но после добавления httpMock.verify () в afterEach () Я получил следующую ошибку:

Error: Expected no open requests, found 1: GET http://localhost:5000/api/v1.0/stat/estimation-graph/

Похоже, запрос вызван, но позже, чем ожидалось. Насколько я подписан на getEstimaGraphData () , он должен вызываться синхронно, верно?

1 Ответ

0 голосов
/ 25 октября 2019

Поскольку вы добавляете параметры с URL-адресом в своей службе, HttpTestingController ожидает, что тестовый URL-адрес также будет содержать параметры. Вместо создания URL-адреса с параметрами в вашем сервисе, передайте их как HttpParams.

getEstimationGraphData(battlecount: number, winCount: number): Observable<IEstimationGraphPoint[]> {
  return this.http.get<IEstimationGraphPoint[]>(this.baseApiUrl(this.graphDataEndpoint), {
    params: {
      battleCount: battlecount.toString(),
      winCount: winCount.toString()
    }
  });
}

Теперь в вашем spec-файле вам нужно использовать пользовательскую функцию для проверки URL-адреса. Используйте следующий код для проверки URL:

const req = httpMock.expectOne((request: HttpRequest<any>) => {
  return request.url === url;
});

request.url будет содержать URL без параметров. Фактический URL-адрес с параметрами будет в request.urlWithParams, если вам нужно также проверить параметры.

Возможно, вам также придется удалить HttpClientModule из вашего спецификации. Вам просто нужно HttpClientTestingModule.

...