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.pagesizeou 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
expectOneavec les paramètres GET estexpectOne. Je trouve plus facile à utiliser lamatchFnsurcharge 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'à