示例:
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
运算符,并将其替换为 if
和 Noop
操作?
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/