我想測試訂閱從服務中的方法返回的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