我试图用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