首页 > 解决方案 > 带有过滤器的ngrx效果是否有效?

问题描述

例子:

myAwesomeEffect$ = createEffect(() =>
    this.actions$.pipe(
        ofType(MyAwesomeAction),
        concatMap(action => of(action).pipe(
            withLatestFrom(this.store$.pipe(select(myAwesomeSelector)))
        )),
        filter(([, myAwesomeValue]) => myAwesomeValue),
        map(() => myNotThatAwesomeAction())
    )
);

有几点需要指出。如您所见,仅当逻辑计算结果为 时才会effect返回。这意味着有时返回一个,有时不返回。actionfiltertrueeffect action

它是有效的effect吗?我应该避免使用filteroperator in并用andeffect替换它吗?ifNoop

myAwesomeEffect$ = createEffect(() =>
    this.actions$.pipe(
        ofType(MyAwesomeAction),
        concatMap(action =>
            of(action).pipe(
                withLatestFrom(
                    this.store$.pipe(select(myAwesomeSelector))
                )
            )
        ),
        map(([, myAwesomeValue]) => {
            if (myAwesomeValue) {
                return myNotThatAwesomeAction();
            }
            return NoopAction();
        })
    )
);

第二个例子很容易测试:

it('should return myNotThatAwesomeAction when myAwesomeValue is true', done => {
    store.overrideSelector(myAwesomeSelector, true);
    myAwesomeEffect$().subscribe(res => {
        expect(res).toEqual(myNotThatAwesomeAction());
        done();
    });
});

it('should return NoopAction when myNotThatAwesomeAction is false, () => {
    store.overrideSelector(myAwesomeSelector, false);
    myAwesomeEffect$().subscribe(res => {
        expect(res).toEqual(NoopAction());
        done();
    });
});

但是第一个例子呢。

it('should return myNotThatAwesomeAction when myAwesomeValue is true', done => {
    store.overrideSelector(myAwesomeSelector, true);
    myAwesomeEffect$().subscribe(res => {
        expect(res).toEqual(myNotThatAwesomeAction());
        done();
    });
});

it('should not return myNotThatAwesomeAction when myNotThatAwesomeAction is false, done => {
    store.overrideSelector(myAwesomeSelector, false);
    // This won't work since the effect won't return anything

    myAwesomeEffect$().subscribe(res => {
        expect(res).not.toEqual(myNotThatAwesomeAction());
        done();
    });
});

我应该用什么替换第二个测试用例?(虽然不使用第三方库)

更新:

要测试包含filter运算符的效果,我选择这种方式:

it('myAwesomeEffect$ does not return anything when myAwesomeValue is false', done => {
    myEffects.myAwesomeEffect$.subscribe(
        () => done.fail(),
        () => done.fail(),
        () => {
            expect(true).toBeTruthy();
            done();
        }
    );

});

因此,如果它抛出、错误或产生值,我们将无法通过测试。

标签: angularrxjsngrxngrx-effects

解决方案


使用过滤器运算符“停止”效果流是有效的。


推荐阅读