Angular 5 Jasmine Error: Expected one matching request for criteria found none

39,266

Solution 1

My problem is solved. After I added to params to the URL (if you use params).

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

HttpTestingController always display only URL without params, but if used expectOne(url) it use a URL with query string like that: http://example.com/path/to/page?name=ferret&color=purple

Solution 2

You should have your test inside a fakeAsync and call tick() at the end of your test. like

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();

})));

Solution 3

You are already calling httpMock.verify(), which should fail if there are unexpected requests, and log some information about those requests to the console. If your expectOne failed with a "found none", and verify did not fail, then your service must not actually have called http.put(). Add some logging or step through the test in a debugger to see what's actually happening.

As other answers have pointed out, this could be due to timing issues. Your service call does not return an Observable or Promise so your spec can't tell when it finishes. This means you'll have to manipulate time with waitForAsync or fakeAsync.

Share:
39,266
mrkernelpanic
Author by

mrkernelpanic

Updated on July 09, 2022

Comments

  • mrkernelpanic
    mrkernelpanic about 2 years

    I have a very simple service call and a jasmine test for it.

    Service call:

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

    My Test Method:

    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();
    }));
    

    I get of course an exception as I expect the url parameter to be "123"and not undefined like in this test case scenario.

    Error: Expected one matching request for criteria "Match URL: http://localhost:8080/myservice/paramX/123", found none.

    What I don't understand is why the test framework says

    found none

    although the request is made. Is there any possibility to let the test framework tell me what other actual calls were made, similar to mockito's verify?