Ошибка Angular 5 Jasmine: ожидался один соответствующий запрос для критериев, не обнаруженных

У меня очень простой сервисный вызов и жасминовый тест.

Служебный вызов:

myServiceCall(testId: number) : void {
    const url = `${this.url}/paramX/${testId}`;
    this.http.put(url, {},{headers: this.headers}).subscribe();
}

Мой метод тестирования:

it('should call myServiceCall', inject([MyService], (service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
}));

Конечно, я получаю исключение, так как ожидаю, что параметр url будет «123», а не undefined, как в этом сценарии тестового примера.

Ошибка: ожидается один запрос соответствия для критерия "URL-адрес соответствия: http://localhost:8080/myservice/paramX/123 ", не нашел.

Я не понимаю, почему тестовая среда говорит

не нашел

хотя запрос сделан. Есть ли возможность позволить тестовой платформе сообщать мне, какие другие фактические вызовы были сделаны, подобно проверке mockito?


person mrkernelpanic    schedule 08.06.2018    source источник
comment
вы пробовали без baseUrl, у меня работает: .expectOne (/ paramX / 123);   -  person Fateh Mohamed    schedule 08.06.2018


Ответы (4)


Моя проблема решена. После того, как я добавил params в URL (если вы используете params).

let results = { param: 'results', value: '50' };
url = `${api.url}${route.url}?${results.param}=${results.value}`;

HttpTestingController всегда отображается только URL без параметров, но если используется expectOne(url), используется URL с такой строкой запроса: http://example.com/path/to/page?name=ferret&color=purple

person Анатолий Погорилий    schedule 10.10.2018
comment
Это было моей проблемой также в Angular 6. HttpTestingController сообщил URL-адрес для запроса DELETE без параметров, но делал запрос с параметрами. Как только я сопоставил параметры в URL-адресе, тест прошел. - person RoboBear; 29.01.2019
comment
если вы ожидаете дату в строке запроса, довольно легко забыть, что аргумент месяца в конструкторе даты основан на нуле, и в результате вы будете чесать голову в течение нескольких минут :) - person JWallace; 23.09.2020

Вы неправильно прочитали ошибку, позвольте мне перефразировать ее для вас:

Ошибка: ожидался один соответствующий запрос [...], не найдено ни одного.

Это просто означает, что ваш URL не совпадает.

Что вы можете сделать, так это добавить консольный журнал вашего URL-адреса с помощью

console.log(req.request.url);

Или вы можете просто попробовать соответствовать запросу.

Другое решение: поскольку вы полагаетесь на переменные среды, вы можете вместо этого запустить этот тест:

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);
person Community    schedule 08.06.2018
comment
Я не хочу вставлять console.logs в свой код, я ожидаю, что среда тестирования клиента angular http предложит мне лучший вывод исключения - если это вообще возможно. - person mrkernelpanic; 08.06.2018
comment
Ну это не так. И я не говорю вам вводить журнал консоли в производство, я говорю вам, чтобы вы могли понять, почему ваш URL не совпадает. Вы можете удалить его позже. - person ; 08.06.2018
comment
@trichetriche, можете ли вы объяснить, как вы можете зарегистрировать request.url, если он не может получить запрос - ошибка в этой строке: let request= httpMock.expectOne(url); - person matchifang; 11.10.2018
comment
@matchifang expectOne(url: string) - одна из сигнатур: у вас есть 3. Одна из них expectOne(matchFn: Function): вы можете предоставить функцию обратного вызова, которая имеет объект HttpRequest в качестве параметра: зарегистрировав этот объект, вы можете получить URL-адрес, который был вызван. - person ; 11.10.2018
comment
@trichetriche Я был бы признателен, если бы вы могли показать мне пример этого? - person matchifang; 11.10.2018
comment
убедитесь, что URL-адрес совпадает с URL-адресом вашего сервиса. - person danywalls; 29.09.2020

У вас должен быть ваш тест внутри fakeAsync и вызвать tick () в конце вашего теста. нравиться

it('should call myServiceCall', inject([MyService], fakeAsync((service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
    tick();

})));
person saidutt    schedule 12.09.2018

Вы уже вызываете httpMock.verify(), который должен завершиться ошибкой, если есть неожиданные запросы, и записывать некоторую информацию об этих запросах в консоль. Если ваш expectOne завершился неудачно, не обнаружив ни одного сообщения, и verify не отказал, значит, ваша служба на самом деле не вызывала http.put(). Добавьте запись в журнал или выполните тест в отладчике, чтобы увидеть, что на самом деле происходит.

Как указывали другие ответы, это может быть связано с проблемами времени. Ваш сервисный вызов не возвращает Observable или Promise, поэтому ваша спецификация не может сказать, когда он завершится. Это означает, что вам придется управлять временем с помощью waitForAsync или fakeAsync.

person Coderer    schedule 26.11.2020