withLatestFrom
我正在使用 Angular 8 和 ngrx 8。我正在尝试为用于从状态中获取一些值的效果编写单元测试。我正在使用rxjs/testing/TestScheduler
这个。在那里,我有一个这样的大理石图:
actions$ = hot('aa', { a: actions.fetchUser({ id: 1 }));
我的效果是这样的:
fetchUser$ = createEffect(() => this.actions$.pipe(
ofType(actions.fetchUser),
withLatestFrom(this.store.select(selectors.user)),
mergeMap(([{ id }, user]) => {
console.log(user);
if (user.id === id) {
return of(user);
}
return this.userService.getUser(id).pipe(
map((user) => actions.updateUser({ user })),
catchError(() => of(actions.updateUser({})))
)
})
))
商店中的初始用户是一个空对象。
这个想法是第一个大理石框架通过调用userService
和更新状态;然后第二帧发生,它看到user.id
在第一帧期间设置的 ,因此它不是调用userService
,而是返回user
已经处于状态的实例。(这只是一个示例;最终目标是避免在服务中重复 HTTP 调用,或者如果用户 id 发生更改则取消之前的调用)。
问题是,在弹珠图中状态似乎没有更新,并且返回的用户对象withLatestFrom
始终是测试中设置的初始状态。
我是 Angular 和 ngrx 测试的新手,所以我不确定这是预期的行为还是我做错了什么。
如果有人可以推荐一种更好的方法来处理和测试这种情况,那也很棒。