comment simuler une erreur http pour le test angular2

j'écris des tests pour un service angular2. Des extraits de Code:

// jasmine specfile

// already injected MockConnection into Http

backend.connections.subscribe ((c: MockConnection) => {
    connection = c;
});

// doing get-request
myServiceCallwithHttpRequest ().subscribe (result => {
    // this test passes!
    expect (result).toEqual ({
        "message": "No Such Object"
    });
    // this test fails, don't know how to get the response code
    expect (whereIsResponseStatus).toBe (404);
});

connection.mockRespond (new Response (new ResponseOptions ({
    body: {
        "message": "No Such Object"
    },
    status: 404
})));

mon Service:

// service

myServiceCallwithHttpRequest (): Observable<Response> {
    return this.http.get ('/my/json-service').map (res => {
            // res.status == null
            return res.json ()
        })
        .catch (this.handleError); // from angular2 tutorial
}

la première attente est OK, le programme va dans l'appel de carte, pas la prise. Mais comment obtenir le code 404? res.le statut est null.

22
demandé sur msdedwards 2016-02-16 18:19:24

4 réponses

pour que l'erreur simulée fonctionne, vous devez importer Responsietype à partir de @angular / http et inclure le type d'erreur dans la réponse simulée, puis étendre la réponse et implémenter L'erreur

import { Response, ResponseOptions, ResponseType, Request } from '@angular/http';
import { MockConnection } from '@angular/http/testing';

class MockError extends Response implements Error {
    name:any
    message:any
}

...
handleConnection(connection:MockConnection) {
    let body = JSON.stringify({key:'val'});
    let opts = {type:ResponseType.Error, status:404, body: body};
    let responseOpts = new ResponseOptions(opts);
    connection.mockError(new MockError(responseOpts));
}
37
répondu amay0048 2016-10-05 00:06:43

en parcourant le code source à node_modules\@angular\http\testing\mock_backend.d.ts. MockConnection.mockRespond est déjà dans votre code. MockConnection.mockError est ce que vous pourriez avoir besoin. Jouez avec et voyez ce que vous obtenez.

2
répondu Timathon 2016-06-15 15:56:35

Vous devez utiliser .subscribeobservable pour vous inscrire success,error& completed rappel

Code

myServiceCallwithHttpRequest (): Observable<Response> {
    return this.http.get ('/my/json-service').map (res => {
            // res.status == null
            return res.json ()
        })
        .subscribe(
            data => this.saveJwt(data.id_token), //success
            err => { //error function
               //error object will have status of request.
               console.log(err);
            }, 
            () => console.log('Authentication Complete') //completed
        );
        //.catch (this.handleError); // from angular2 tutorial
}
1
répondu Pankaj Parkar 2016-02-16 15:40:48

fonctionne pour moi:

    mockConnection.mockRespond (new Response (new ResponseOptions ({
        body: {},
        status: 404
    })));
0
répondu user3725805 2016-07-12 11:32:26