我試圖用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.map
但then
最後一點沒有在測試中運行。我認爲問題出在服務中的toPromise
。
任何一種hep將不勝感激。
導入它我相信問題是因爲沒有訂閱「observable」,所以它沒有發送出價值。 – raj