J'ai cet appel de service que j'essaie de tester
describe('CountriesService Tests', () => { let countriesService: CountriesService; let httpTestingController: HttpTestingController; let countries: Country[] = [ { Country: 'ALBANIA', CountryCode: 'AL', ReportingCountryCode: 'ALB' }, { Country: 'Canada', CountryCode: 'CA', ReportingCountryCode: 'CND' }]; beforeEach(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [CountriesService] }); countriesService = TestBed.get(CountriesService); httpTestingController = TestBed.get(HttpTestingController); }); afterEach(() => { httpTestingController.verify(); }); it('should return all countries', () => { countriesService.get().subscribe((data: Country[]) => { expect(data).toBe(countries); }); const url = ({ const: environment.url + 'countries', params: {'pagesize': '300'}}); let countriesRequest: TestRequest = httpTestingController.expectOne(url.const + url.params); expect(countriesRequest.request.method).toEqual('GET'); countriesRequest.flush(countries); })});
et voici le test:
get(): Observable<Country[]> { const config = { params: new HttpParams().set('pagesize', '300') }; return this.http .get<any>(`${api_url}countries`, config) .pipe(map(response => (response.data as Country[]))); }
J'obtiens cette erreur: Erreur: Une demande correspondante attendue pour les critères "URL de correspondance: / api / publicdata / pays [objet objet]", n'en trouve aucune. la question nous sur les paramètres passés dans l'appel, et je ne sais pas comment les ajouter. Pouvez-vous s'il vous plaît aider.
3 Réponses :
Vous attendez probablement l'appel http après son exécution, essayez le cas de test ci-dessous
it('should return all countries', () => { const url = ({ const: environment.url + 'countries', params: {'pagesize': '300'}}); let countriesRequest: TestRequest = httpTestingController.expectOne(url.const + url.params); countriesService.getCountries().subscribe((data: Country[]) => { expect(data).toBe(countries); }); expect(countriesRequest.request.method).toEqual('GET'); countriesRequest.flush(countries); })});
Toujours la même erreur. C'est quelque chose à voir avec l'ajout de paramètres dans un appel de service. Je supprime les paramètres cela fonctionne bien mais comme notre back-end peut faire toutes sortes de filtrage en ajoutant des paramètres à l'appel, je dois m'assurer que l'appel est comme il est supposé être
vous pouvez probablement supprimer les paramètres, car vous essayez seulement de vous attendre à l'appel http. vous devriez également vous moquer de l'appel http. Ajoutez l'instruction ci-dessous également countriesRequest.result([country array]
Je ne sais pas si OP l'a corrigé ou non!
expectOne(url.const + url.params) // Wrong expectOne(url.const + '?param1=value') // should be that
Peut-être suis-je en retard mais cette solution ci-dessous fonctionnera pour vous les gars
HttpParams
et append()
tous vos paramètres de requête.HttpRequest
et fournissez-lui des valeurs appropriées.httpTestingController.expectOne()
comme indiqué ci-dessousurlWithParams
pour comparer les URL car cela réduit le code de vérification de chaque objet param.it('should return all countries', fakeAsync(() => { countriesService.getCountries().subscribe((data: Country[]) => { expect(data).toBe(countries); }); // you can create multiple parameters by appending on same object let parameters = new HttpParams().append('pagesize', '30'); // environment is your base url const httpReq = new HttpRequest('GET',environment.url, {params:parameters}); let countriesRequest = httpTestingController.expectOne((req:HttpRequest)=> req.method === httpReq.method && req.urlWithParams === httpReq.urlWithParams ); countriesRequest.flush(countries); httpTestingController.verify(); });
C'est peut-être une faute de frappe, mais la méthode de service est get () mais vous n'appelez pas réellement cette méthode spécifique dans le test, vous appelez à la place getCountries (). Aussi oui, vous ne pouvez pas insérer un objet dans une chaîne comme celle-là. Utilisez des chaînes de modèle ou une concaténation de chaînes pour extraire les propriétés spécifiques que vous attendez.
+ '?pagesize' + params.pagesize
ou similaire. Faites-le correspondre à ce que l'application en cours d'exécution transforme l'URL.C'était une faute de frappe Merci cependant
Utiliser
expectOne
avec les paramètres GET estexpectOne
. Je trouve plus facile à utiliser lamatchFn
surcharge deexpectOne
( angular.io/api/common/http/testing/HttpTestingController ). Il reçoit l'objetHttpRequest
, vous pouvez donc facilement comparer l'url de base et les valeurs des paramètresexemple s'il vous plaît, je ne peux pas voir la fonction matchFn, ne correspond qu'à