首页 > 解决方案 > 如何在 ngRX 效果中测试 forkJoin

问题描述

我正在尝试使用 forkjoin 测试 ngrx 效果,但我无法使其工作。这是代码:

requestVacationDays$ = createEffect(
        () =>
            this.action$.pipe(
                ofType(VacationsActions.RequestVacationDays),
                switchMap(action => {
                    const httpRequests: Observable<any>[] = [];
                    action.requestedDays.forEach(request => {
                        httpRequests.push(this.vacationService.requestVacationDay(request));
                    });
                    return forkJoin(httpRequests).pipe(
                        switchMap(res => {
                            return [ModalActions.OpenModal({
                                header: 'Requested vacations',
                                message: 'All vacations has been requested correctly.'
                            }), VacationsActions.GetUserVacations()];
                        }),
                    );
                })
            ), { dispatch: true }
    );

这是测试(它还没有完成,但它没有到达 forkJoin 内的 switchMap):

fit('should request several vacation days', () => {
        actions$ = of(vacationActions.RequestVacationDays({ requestedDays: ['2020-09-25', '2020-09-26'] }));
        const vacationServiceSpy = spyOn(vacationService, 'requestVacationDay').and.returnValue(cold('-a', { a: null}));
        effects.requestVacationDays$.subscribe(action => {
            expect(vacationServiceSpy).toHaveBeenCalledTimes(2);
        });
    });

标签: angularrxjsjasminengrx

解决方案


forkJoin仅在其源 observables 发出完成信号时才发出。在您的测试中,您只发出值null- 您还需要在之后发出完成信号


推荐阅读