0
votes

test unitaire d'appel de service http angulaire avec paramètres

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.


4 commentaires

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 est expectOne . Je trouve plus facile à utiliser la matchFn surcharge de expectOne ( angular.io/api/common/http/testing/HttpTestingController ). Il reçoit l'objet HttpRequest , vous pouvez donc facilement comparer l'url de base et les valeurs des paramètres


exemple s'il vous plaît, je ne peux pas voir la fonction matchFn, ne correspond qu'à


3 Réponses :


0
votes

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


2 commentaires

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]



1
votes

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


0 commentaires

0
votes

Peut-être suis-je en retard mais cette solution ci-dessous fonctionnera pour vous les gars

  1. Créez un objet HttpParams et append() tous vos paramètres de requête.
  2. Créez un objet HttpRequest et fournissez-lui des valeurs appropriées.
  3. Appelez ensuite httpTestingController.expectOne() comme indiqué ci-dessous
  4. J'ai utilisé urlWithParams 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();
});


0 commentaires