0

我正在尝试测试一个看起来像这样的服务数据流:

loadHeader() {
    this.cbData.fetchHeader()
        .pipe(
            tap(header => console.log('FIRST: ', header)),
            withLatestFrom(this.user.userInfo$),
            map(([header, user]) => {
                console.log(header);
                console.log(user);
                if (user) {
                    header.userProfile.user = user;
                }

                return header;
            }),
            tap(header => this.cbHeader.saveHeaderData(header)),
            tap(header => console.log('Im def here: ', header)),
        )
        .subscribe();
}

使用以下几行的测试用例:

fit('adds user info when user supplied', fakeAsync(() => {
    const u: UserAuthInfo = <UserAuthInfo>{ id: '1' };
    const h = { userProfile: {} };

    const header$ = cold('-x--|', { x: h });
    const user$ = cold('--y-|', { y: u });

    spyOn(cbData, 'fetchHeader').and.returnValue(header$);
    user.userInfo$ = <any>user$;

    spyOn(cbHeader, 'saveHeaderData').and.callThrough();

    service.loadHeader();
    tick(40);

    expect(cbHeader.saveHeaderData).toHaveBeenCalledWith({ userProfile: { user: { id: '1' } } });
}));

这行不通。我已经在测试代码上尝试了许多其他变体(比如直接使用 next() 通过 userInfo$(it's a BehaviorSubject) 发送信息)——但大多数情况下,我希望能给我更多关于这种场景的一般性建议.

4

0 回答 0