2017-02-24 79 views
1

在我的應用程序中,我編寫了一個AuthService來處理後端服務授權。要通知組件關於新的登錄狀態,我使用一個BehavourSubject來更新它的用戶。在這裏,(簡化)代碼:單元測試使用RxJs主題的Angular2服務

@Injectable() 
export class OAuth2Service { 

    private authState: BehaviorSubject<boolean> = new BehaviorSubject(false); 

    login(): void { 
     this.authState.next(true); 
    } 

    public getAuthState(): Observable<boolean> { 
     return this.authState.asObservable(); 
    } 
} 

現在我想單元測試的行爲,並寫了一個測試根據Angular2文檔和Ticket如下:

it('should handle auth state', async(inject([OAuth2Service, TokenDao], (oAuth2Service: OAuth2Service, tokenDao: TokenDao) => { 

    return oAuth2Service.getAuthState().toPromise() 
     .then((state) => { 
      expect(state).toEqual(false); 
     }); 
    }) 
)); 

不幸的是,toPromise()是永遠不會執行它的()回調。據我所知,這是因爲Observable永遠不會完成(正如預期的那樣,auth狀態可以在整個應用生命週期中改變)。 See here

注意:不會調用login(),因爲BehaviourSubject應該默認爲false。我修改了測試以調用login()。仍然沒有承諾回調。

問題:如何正確測試auth服務的行爲?我錯過了什麼?

+0

嘗試從您的測試中移除「return」 –

回答

1

我的解決方案是避免使用Angular2測試助手方法。所以我重構了測試:

it('should handle auth state', (done) => { 
    let oAuth2Service: OAuth2Service = TestBed.get(OAuth2Service); 
    oAuth2Service.getAuthState().subscribe((state) => { 
     expect(state).toEqual(false); 
     done(); 
    }); 
}); 

使用Jasmines done()回調到目前爲止做了伎倆。