2 votes

Test Angular d'une requête GET nécessitant un service d'authentification

Je suis nouveau dans les tests Karma/Jasmine et j'essaie de mettre en place un test pour mon service qui effectue une requête GET. J'utilise le XHRBackend avec un objet MockBackend pour simuler de fausses requêtes et réponses. J'ai un "webService" qui exécute la requête GET et un "authService" qui contient la chaîne de connexion et le jeton d'accès. J'ai configuré ce test comme suit :

describe('WebService Tests', () => {

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [HttpModule],
            providers: [
                AuthService,
                AdalService,
                WebServicesService,
                { provide: XHRBackend, useClass: MockBackend }
            ]
        })
        .compileComponents();
    }));

beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
            backend = be;
            authService = new AuthService(new AdalService(), http);
            webService = new WebServicesService(http, authService);
            fakeWebServicesData = makeServicesData;
            let webOptions = new ResponseOptions({status: 200, body: {data: fakeWebServicesData}})
            webResponse = new Response(webOptions);
        }));

        it('should have expected successful GET of WebServices', async(inject([], () => {
            backend.connections.subscribe((c: MockConnection) => c.mockRespond(webResponse));

            webService.getWebServices().toPromise()
            .then(data => {
                expect(data.length).toBe(fakeWebServicesData.length,
                'should have received all web services data');
            })

        })))

La réponse que je reçois est un échec car data.length est indéfini, alors qu'il devait être égal à 1 (les données fictives que j'utilise sont de longueur 1). Je ne sais pas trop pourquoi cela se produit. La méthode appelée est la suivante :

getWebServices(): Observable<WebService[]> {
        let connection = this.authService.connection + '/services';
        // Add authorization header with jwt token
        let token = this.authService.getToken();
        let headers = new Headers({ 'Authorization': 'Bearer ' + token });
        let options = new RequestOptions({ headers: headers });

        // Get services from web service api endpoint
        return this.http.get(connection, options)
            .map((response: Response) => response.json())
            .catch((error: Response) => {
                return Observable.throw(error);
            });
    }

Je pense qu'étant donné que je ne me suis pas encore connecté au service d'authentification avant d'effectuer la requête fictive, il est possible que celle-ci renvoie une valeur non définie. Dois-je me connecter avec mon service d'authentification avant de créer cette requête fictive ? (Si oui, comment puis-je effectuer deux requêtes fictives à la suite dans le même test ? Ou y a-t-il une autre façon de simuler l'authentification ? Toute aide serait appréciée. Merci beaucoup.

UPDATE : Voici mes fausses données

const makeServicesData = [
    { 
        name: "service1", version: "1.0.0", versionPublishedBy: "",
        creationTime: "", snapshotId: "", runtimeType: "",
        initCode: "", code: "", description: "", operationId: "",
        inputParameterDefinitions: [
            { name: "", type: "" }
        ],
        outputParameterDefinitions: [
            { name: "", type: "" }
        ],
        outputFileNames: [""],
        myPermissionOnService: "read/write"
    }
]

0voto

mahulst Points 385

Vous devriez changer l'attente en data.data.length. La structure que vous avez nommée data contiendra { data: [ ...actual data ] } . Je suggère également de le renommer en réponse ou autre. Mais pourriez-vous vérifier si cela fonctionne ?

it('should have expected successful GET of WebServices', async(inject([], () => {
        backend.connections.subscribe((c: MockConnection) => c.mockRespond(webResponse));

        webService.getWebServices().toPromise()
        .then(data => {
            expect(data.data.length).toBe(fakeWebServicesData.length,
            'should have received all web services data');
        })

    })))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X