raj
raj

Reputation: 6094

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

I am trying to test my Ionic app with Jasmine. This is my test suit.

  beforeEach(() => {
    auth = new Authentication(<any>new HttpMock(), <any>new StorageMock())
    user = new MockUser();
    header = new Headers({'uid': '1'});
    resp = new Response( new ResponseOptions({body: {name: user.name }, headers: header}))
  });
  it('facebok login ',(done)=>{
    spyOn(auth.http,'post').and.returnValue(HttpMock.returnValue(resp));
    spyOn(Facebook,'login').and.returnValue(Promise.resolve({authResponse: {accessToken: 1}}))
    auth.facebookLogin().then((res)=>{
      expect(auth.http.post.calls.argsFor(0)).toEqual([CONFIG.url.facebookUrl,{}])
      expect(res.authResponse.accessToken).toEqual(1);
      done();
    },(err)=>{
      done();
    });
  });

My HttpMock class to mock http calls looks like this.

export class HttpMock {
  static returnValue(data){
    return Observable.create((observer) => {
      observer.next(data);
    })
  }
}

The relevant part in the service I am testing is,

  facebookLogin(): Promise<any>{
    let permissions = ["public_profile","email"];
    return Facebook.login(permissions)
    .then( (response) => {
      let token = { access_token: response.authResponse.accessToken };
      return this.login( token ,'facebookUrl').toPromise();
    }).catch( this.handleError);

  login(data , urlKey): Observable<any>{
    return this.http.post(CONFIG.url[urlKey], data)
    .map( (res: Response) => this.saveUserInfo(res) ).catch( this.handleError)
  }
  saveUserInfo(res: Response): Response{
    let userInfo = this.getUserInfo(res);
    this.user = userInfo;
    this.storage.set('user', userInfo);
    return res;
  }

The facebookLogin method goes like this. Access Facebook class login method which returns a promise. With information from the promise, I make http post request and save the returned data and then convert observable to promise with toPromise. In the test I spy on Facebook.login to return a resolving promise and spyOn http.post to return a successful observable. This is working fine in my app.But I am unable to run the test as it give the following error.

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

The code runs fine till the last point in http.post.map but then is not being run in the test. I think the problem is with the toPromise in the service.

Any kind of hep would be appreciated.

Upvotes: 0

Views: 664

Answers (1)

raj
raj

Reputation: 6094

From my limited knowledge on Observable , I believe the problem with the approach was due to the fact that toPromise didnt get the value from observer.next(data). I assume subscription is necessary for that. The simple approach with Observable.of worked for me. You can import it from import 'rxjs/add/observable/of'

Upvotes: 1

Related Questions