javascript - Angular 2 Observable and Promise callback unit testing -


i have method in angular 2 service, gets details of specific user account - 1 that's logged in - , returns observable.

(i using angularfire2 authentication, it's worth)

as can see, getdata method using getauth method returns authentication state (as observable), in turn used gettoken method (which returns promise) token used populate authorization headers , http request. (i understand code might require refactoring, , appreciate feedback on that)

getdata(): observable<idata> {     let authheaders = new headers();      return observable.create((o: observer<idata>) => {         this.getauth().subscribe((authstate: istate) => {             this.gettoken(authstate).then(token => {                 /* ...                  * things token, call http service etc.                  */ ...                 authheaders.set('authorization', token);                  this.http.get('myendpoint/', {                     headers: this.authheaders                 })                 .map((response: response) => response.json())                 .map((data: idata) => {                     o.next(data);                 });             })             .catch((error: error) => {                 observable.throw(new error(`error: ${error}`));             });         });     }); } 

i new unit testing, , have been trying test method, still cannot cover .catch of promise inside method.

here's unit test looks like:

describe('service: userdataservice', () => {     let mockhttp: http;     let service: userdataservice;     let getauthspy: jasmine.spy;     let gettokenspy: jasmine.spy;      beforeeach(() => {         mockhttp = { get: null } http;          testbed.configuretestingmodule({             providers: [                 { provide: http, usevalue: mockhttp },                 angularfire,                 userdataservice,             ]         });          service = new userdataservice(angularfire, mockhttp);          spyon(mockhttp, 'get').and.returnvalue(observable.of({             json: () => {                 "nickname": "mocknickname"             }         }));          getauthspy = spyon(service, 'getauth').and.returnvalue(observable.of({           "auth": {             "uid": "12345"         }));          gettokenspy = spyon(service, 'gettoken').and.returnvalue(new promise((resolve, reject) => {             resolve('test promise response');         }));     });      describe('getlead', () => {         beforeeach(() => {             spyon(service, 'getlead').and.callthrough();         });          it('should return object of user data , set datastore.useremail if state exists', () => {             service.getlead().subscribe(res => {                 expect(res).toequal(jasmine.objectcontaining({                     nickname: 'mocknickname'                 }));             });              expect(service.getlead).tohavebeencalled();         });          it('should throw, if no authstate provided', () => {             getauthspy.and.returnvalue(observable.of(false));              service.getlead();              expect(service.getlead).tothrow();         });          it('should throw, if gettoken() fails return token', () => {             gettokenspy.and.returnvalue(new promise((resolve, reject) => {                 reject('test error response');             }));              /*              * getting lost              */              service.getlead();              expect(service.getlead).tothrow();         });     }); }); 

from understand have somehow make promise gettoken reject, , test see if observable throw.

any or feedback appreciated.

i don't use either jasmine nor angularfire2 can't tell have code it's obvious this.gettoken(authstate) returns promise.

question library promise class comes (aka polyfill you're using).

as far know implementations of promises/a should wrap callback calls try - catch, if callback in then(...) throws exception promise propagate catch(). guess fake response this.http.get('myendpoint/') malformed json cause error @ response.json().

second thing inner callback catch():

.catch((error: error) => {     observable.throw(new error(`error: ${error}`)); }); 

this literally nothing. there's no return statement , observable.throw() needs appear inside observable chain something. note .catch() method comes promise class , not observable.

if want propagate error observers have explicitly call:

.catch((error: error) => {     o.error(error); }); 

maybe if error bubbled observable.create() passed observer well, i'm not sure this.


Comments

Popular posts from this blog

php - How to add and update images or image url in Volusion using Volusion API -

javascript - jQuery UI Splitter/Resizable for unlimited amount of columns -

javascript - IE9 error '$'is not defined -