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