2017-02-24 55 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()回调到目前为止做了伎俩。