angular - 带滤镜的 ngrx 效果有效吗?

标签 angular rxjs ngrx ngrx-effects

示例:

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

有几件事需要指出。正如您所看到的,仅当 filter 逻辑计算结果为 true 时,effect 才会返回 action。这意味着效果有时返回一个操作有时不

它是有效的效果吗?我是否应该避免在 effect 中使用 filter 运算符,并将其替换为 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();
        }
    );

});

因此,如果它抛出错误或产生值,我们的测试就会失败。

最佳答案

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

关于angular - 带滤镜的 ngrx 效果有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69398245/

相关文章:

angular - 在单元测试中使用参数模拟 ngrx 存储选择器(Angular)

angular - Angular 应用程序中的 ngrx 导入

angular - NGRX reducer 多个实例的选择器

javascript - Angular 通配符路由替换子路由

angular - 如何在 Angular 不同的不相关组件之间同步数据(rxjs 6)

javascript - 如何将可观察到的类型转换为它的类型?

angular - 在ngrx效果中实现catchError后全局ErrorHandler不起作用

javascript - 如何通过分配测试组件中可观察的服务

angularjs - RxJS 5 和缓存运算符的替代品

angular - 如何为 Angular 应用程序预渲染静态 HTML 页面?