错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL

时间:2016-11-27 10:07:47

标签: angularjs ionic-framework jasmine karma-jasmine

我正在尝试使用Jasmine测试我的Ionic应用。这是我的考试。

  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();
    });
  });

我的HttpMock类来模拟http次调用就像这样。

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

我正在测试的服务的相关部分是,

  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;
  }

facebookLogin方法是这样的。访问返回promise的Facebook类登录方法。根据承诺中的信息,我发出http post请求并保存返回的数据,然后将observable转换为承诺toPromise。在测试中,我监视Facebook.login以返回解析承诺并spyOn http.post以返回成功的observable。这在我的应用程序中工作正常。但是我无法运行测试,因为它给出了以下错误。

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

代码运行正常,直到http.post.map中的最后一点,但then未在测试中运行。我认为问题出在服务中的toPromise

任何类型的肝脏将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据我对Observable的有限知识,我认为该方法的问题是由于toPromise没有从observer.next(data)获得值。我认为subscription是必要的。 Observable.of的简单方法对我有用。您可以从import 'rxjs/add/observable/of'

导入它