2016-11-27 94 views
0

我试图用Jasmine测试我的Ionic应用程序。这是我的测试套装。错误:超时 - 在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调

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方法是这样的。访问返回承诺的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.mapthen最后一点没有在测试中运行。我认为问题出在服务中的toPromise

任何一种hep将不胜感激。

+0

导入它我相信问题是因为没有订阅“observable”,所以它没有发送出价值。 – raj

回答

0

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