2017-10-17 30 views
0

Je suis assez nouveau pour Angular4 et j'ai besoin d'écrire des tests unitaires pour un simple service que j'ai construit, mais je ne sais pas par où commencer.Angular4 - comment tester un service

Le service consiste simplement à insérer un appel api comme suit:

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import { HttpClient } from '@angular/common/http'; 
import 'rxjs/add/operator/map'; 

import { KeyValuePair } from '../../models/keyvaluepair'; 
import { environment } from './../../../environments/environment'; 

// Lookups api wrapper class. 
@Injectable() 
export class LookupsService { 

    private servicegApiUrl = ''; 

    public constructor(private http : HttpClient) { 
     // Build the service api url, uring the environment lookups api url, plus controller name to reference. 
     this.servicegApiUrl = environment.webApiUrl + 'Lookups/'; 
    } 

    // Get the hubs from the web api. 
    public getHubs() : Observable<KeyValuePair<number>[]> { 
     // Carry out http get and map the result to the KeyValuePair number object. 
     return this.http.get<KeyValuePair<number>[]>(this.servicegApiUrl + 'Hubs').map(res => { return res; }); 
    } 
} 

J'ai besoin de tester mes méthode getHubs() et ne sais pas comment. En outre, j'ai vu divers articles en ligne sur le test d'un service et je ne suis pas sûr si je dois me moquer des résultats attendus ou si cela devrait effectivement appeler le service Web. J'ai ce code, mais le attends ne semble jamais exécuté:

import { TestBed, async, inject } from '@angular/core/testing'; 
import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http'; 
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; 
import { LookupsService } from './Lookups.Service'; 
import { KeyValuePair } from './../../models/KeyValuePair'; 

describe(`LookupsService tests`,() => { 

    beforeEach(() => { 

    TestBed.configureTestingModule({ 
     imports: [ 
     HttpClientModule, 
     HttpClientTestingModule 
     ], 
     providers: [ 
     LookupsService 
     ] 
    }); 
    }); 



    it(`should get results from the web method`, async(inject([ LookupsService, HttpTestingController ], 

    (service: LookupsService, backend: HttpTestingController) => { 

     service.getHubs().subscribe((hubs : KeyValuePair<number>[]) => { 
     // This code never seems to run... 
     console.log(hubs.length); 
     expect(hubs.length).toBeGreaterThan(0); 
     }); 
    }))); 

}); 

Pour la classe complet KeyValuePair ressemble à ceci:

export class KeyValuePair<T> { 
    Key : string; 
    Value : T; 
} 

Toute aide très appréciée!

Répondre

0

Les tests unitaires sont censés (au moins dans la plupart des cas) tester votre code sans l'utilisation d'API réels ou d'appels de base de données. Une façon de faire est de se moquer des bibliothèques/dépendances/parties du code qui est utilisé pour gérer les données réelles.

Dans votre cas, vous pouvez créer un service FakeHttpClient, qui gérera vos fausses données, et l'utilisera lorsque vous testez votre service LookupService. Initialisation irait quelque chose comme ceci:

var lookupService = new LookupService(new FakeHttpClientService()); 
//rest of your code for testing LookupService class. 

Vous pouvez trouver plus de détails here.

+0

Ok cool - donc le meilleur pour tester quand ne dépend pas de l'API réel. Donc, je me suis moqué de faire des appels réels. Quelqu'un at-il de bons exemples de tester un service avec HttpClient comme une dépendance avec des résultats moqués? –

+0

Vous pouvez toujours essayer d'utiliser 'spyOn' pour espionner une méthode. Vérifiez cette réponse SO pour l'utilisation: https://stackoverflow.com/questions/30658525/spy-on-a-service-method-call-using-jasmine-spies – eminlala