对使用 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 文档和 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() 永远不会执行其 then() 回调。据我所知,这是因为 Observable 永远不会完成(如预期的那样。auth 状态可以在整个应用程序生命周期中更改)。 See here.
注意:未调用 login() 是因为 BehaviourSubject 应默认为 false。我修改了测试以调用 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() 回调可以解决问题。
在我的应用程序中,我编写了一个 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 文档和 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() 永远不会执行其 then() 回调。据我所知,这是因为 Observable 永远不会完成(如预期的那样。auth 状态可以在整个应用程序生命周期中更改)。 See here.
注意:未调用 login() 是因为 BehaviourSubject 应默认为 false。我修改了测试以调用 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() 回调可以解决问题。