web-dev-qa-db-fra.com

Angular 5 Jasmine Error: Une requête correspondante attendue pour les critères n'a été trouvée.

J'ai un appel de service très simple et un test au jasmin pour cela. 

Appel de service:

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

Ma méthode de test:

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

Je reçois bien sûr une exception car je m'attends à ce que le paramètre d'URL soit "123" et non indéfini comme dans ce scénario de test.

Erreur: Une requête correspondante attendue pour les critères "URL de correspondance: http: // localhost: 8080/myservice/paramX/123 ", aucun élément trouvé.

Ce que je ne comprends pas, c'est pourquoi le framework de test dit 

trouvé aucun

bien que la demande soit faite. Existe-t-il une possibilité de laisser le cadre de test me dire quels autres appels réels ont été effectués, similaires à ceux de mockito?

4
mrkernelpanic

Mon problème est résolu. après avoir ajouté à url, params (si vous utilisez params).

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

HttpTestingController n'affiche toujours que l'URL sans paramètre, mais s'il est utilisé expectOne(url), il utilise l'URL avec une chaîne de requête comme celle-ci: http://example.com/path/to/page?name=ferret&color=purple

Vous avez mal lu l'erreur, laissez-moi la reformuler: 

Erreur: Une requête correspondante attendue [...], aucune trouvée.

Cela signifie simplement que votre URL ne correspond pas. 

Ce que vous pouvez faire est d’ajouter un journal de console de votre URL avec 

console.log(req.request.url);

Ou vous pouvez simplement essayer de correspondre à la demande. 

Autre solution: puisque vous utilisez des variables d’environnement, vous pouvez exécuter ce test à la place: 

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);
4
trichetriche

Vous devriez avoir votre test dans un faux asynchrone et appeler tick () à la fin de votre test . Comme 

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

})));
0
saidutt