【发布时间】:2016-06-10 02:17:23
【问题描述】:
我想测试 Angular 2 组件内部的一个方法,该组件订阅了一个从服务中的方法返回的 observable。下面是服务方法的代码总结:
public create(user: User): Observable<any> {
return this.http.post(this._api.create,
JSON.stringify(user), {
headers: this.apiConfig.getApiHeaders()
}).map((res: Response) => res.json());
}
对这个方法进行单元测试很容易,因为它返回一个 observable,所以我可以订阅它。但是我想测试已经订阅这个的组件中的方法:
public onSubmit(user: User): void {
this._authentication.create(user).subscribe((token) => {
localStorage.setItem('token', token);
this.router.navigate(['/Home']);
});
}
到目前为止,这是我的规范,但是当我尝试监视 localStorage.setItem 时,它返回为没有被调用。我的理解是它可能在实际调用之前检查它是否被调用。
it('Should login a user and on success store a token in localStorage',
injectAsync([TestComponentBuilder], (tcb) => {
return tcb.createAsync(Login).then((fixture) => {
let instance = fixture.debugElement.componentInstance;
localStorage.clear();
spyOn(localStorage, 'setItem');
instance.onSubmit({userId: 'some@email.com', password: 'password', siteName: 'sample'});
expect(localStorage.setItem).toHaveBeenCalled();
});
})
);
我想知道是否需要模拟 this._authentication.create 方法以返回一个带有模拟响应的新 observable?
经过更多研究,一些文章表明我确实需要模拟服务并返回一个同步运行的 Observable.of() 来解决问题,我复制下面的代码。然而这仍然不起作用,我大部分时间都在做这个,我不觉得这应该那么难,任何帮助表示赞赏。
class MockAuthentication extends Authentication {
public create(user: Object): Observable<any> {
return Observable.of({'test': 'test'});
}
}
【问题讨论】: