簡體   English   中英

對使用RxJs主題的Angular2服務進行單元測試

[英]Unit Test a Angular2 service that uses RxJs subjects

在我的應用程序中,我編寫了AuthService來處理后端服務授權。 為了通知組件新的登錄狀態,我使用一個BehavourSubject來更新其訂閱者。 這是(簡化的)代碼:

@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文檔和該故障編寫了一個測試,如下所示:

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

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

不幸的是,toPromise()從未執行過then()回調。 據我所知,這是因為Observable從未完成(如預期的那樣。auth狀態可以在整個應用程序生命周期中更改)。 看這里

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

問題:如何正確地對我的身份驗證服務的行為進行單元測試? 我錯過了什么?

我的解決方案是避免使用Angular2測試助手方法。 因此,我將測試重構為:

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

到目前為止,使用Jasmines done()回調可以達到目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM