我想测试订阅从服务中的方法返回的observable的Angular 2组件中的方法。下面是在总结服务方法的代码:测试订阅observable的方法 - Angular 2
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());
}
很容易单元测试这种方法,因为它返回一个可观察的,所以我可以只订阅。但我想测试的方法在已经订阅了这个组件:
public onSubmit(user: User): void {
this._authentication.create(user).subscribe((token) => {
localStorage.setItem('token', token);
this.router.navigate(['/Home']);
});
}
我的继承人规范,到目前为止,但是当我尝试spyOn的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: '[email protected]', password: 'password', siteName: 'sample'});
expect(localStorage.setItem).toHaveBeenCalled();
});
})
);
我想知道如果我需要模拟出this._authentication.create方法返回一个新的观察到的,在这一个模拟的反应?
经过更多的研究,一些文章指出我需要嘲笑服务并返回一个同步运行的Observable.of()来解决问题,请仔细复制下面的代码。然而,这仍然不起作用,我一直在这一天的大部分时间里工作,我不觉得这应该是那么辛苦,任何帮助表示赞赏。
class MockAuthentication extends Authentication {
public create(user: Object): Observable<any> {
return Observable.of({'test': 'test'});
}
}
感觉就像检查会发生,他们接到电话,因为之前的认购,但我是新观察者。此外,我们以前只是在Angular 1中使用spyOn(localStorage,'setItem'),但我很难搞清楚如何对Angular 2做同样的处理。 – HomeBrew
我的不好,看起来你仍然使用spyOn相同,我的问题是我无法弄清楚你需要从哪里导入'spyOn',但似乎你只是拥有它。但是,似乎我之前对支票发生的陈述仍然正确。我已经更新了我的问题以包含规范。 – HomeBrew