【问题标题】:Unit Test a Angular2 service that uses RxJs subjects对使用 RxJs 主题的 Angular2 服务进行单元测试
【发布时间】:2017-02-24 13:45:40
【问题描述】:

在我的应用程序中,我编写了一个 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 永远不会完成(如预期的那样。身份验证状态可以在整个应用程序生命周期中更改)。 See here.

注意:login() 不会被调用,因为 BehaviourSubject 应该默认为 false。我也将测试修改为调用 login()。仍然没有承诺回调。

问题:如何正确地对我的身份验证服务的行为进行单元测试?我错过了什么吗?

【问题讨论】:

  • 尝试从您的测试中删除return

标签: unit-testing angular rxjs observable subject


【解决方案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() 回调就可以解决问题。

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多