2016-11-27 91 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'