angular - 带有过滤器的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
返回。这意味着有时返回一个,有时不返回。action
filter
true
effect
action
它是有效的effect
吗?我应该避免使用filter
operator in并用andeffect
替换它吗?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();
}
);
});
因此,如果它抛出、错误或产生值,我们将无法通过测试。
解决方案
使用过滤器运算符“停止”效果流是有效的。
推荐阅读
- oracle - ORA-02267: 与引用列的数据类型或排序规则不兼容
- java - 我如何将下面用于将线程运行到 Swift 的通用 Java 代码翻译?
- websphere - 在 IBM websphere 应用程序服务器 8.5.5 上新建配置文件时面临的问题
- angular - 在其他服务角度单元测试中订阅 EventEmiter
- oracle - 通过 API 获取 Oracle BI 企业版仪表板编号
- azure - Azure 应用服务上的 ssh 启用问题以及运行的可执行 jar
- node.js - 返回从 CSV 解析器创建的字典
- javascript - messageDelete 事件和部分 discord.js v12
- spring-boot - 具有多个身份验证配置文件的 Spring Boot
- java - 以贪婪的方式分配给定的数字