我正在尝试使用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
。
任何类型的肝脏将不胜感激。
答案 0 :(得分:0)
根据我对Observable
的有限知识,我认为该方法的问题是由于toPromise
没有从observer.next(data)
获得值。我认为subscription
是必要的。 Observable.of
的简单方法对我有用。您可以从import 'rxjs/add/observable/of'