redux - 测试 redux-observable 史诗的错误处理

标签 redux rxjs rxjs5 reactivex redux-observable

这里我使用的是redux-observable,并且在测试错误处理时遇到了一些问题。

查看以下注销用户史诗:

const logoutUserEpic = (action$) => action$
    .ofType(LOGOUT_USER)
    .mergeMap(() =>
        Observable.from(
            graphQl(AuthLogout)
                .catch((error) => failure(error))
        )
        .mergeMap(() => Observable.of(
                receive(),
                push('/login')
            )
        )
    )

这是一个模拟 graphQl 服务的测试,以确保它在 promise 拒绝时触发失败操作:

it('should return the error action', () => {
    const error = Error('fail')
    request.graphQl = () => Promise.reject(error)

    const action$ = ActionsObservable.of((logoutUser()))

    return logoutUserEpic(action$)
    .toArray()
    .forEach((actions) => {
        expect(actions).toEqual([{
            meta: { isFetching: false },
            payload: error,
            type: FAILURE
        }])
    })
})

在测试中,它分派(dispatch)在 mergeMap 中扁平化的操作,而不是 catch 中预期的失败操作。

像这样设置错误处理是否有效,还是我对 RxJs 表现出了我的笨拙?

最佳答案

问题是您捕获了 Promise 本身的错误,然后捕获了 mergeMap忽略了 Promise 的结果,所以你扔掉了 failure(error) (大概是一个错误操作)

const logoutUserEpic = (action$) => action$
    .ofType(LOGOUT_USER)
    .mergeMap(() =>
        Observable.from(
            graphQl(AuthLogout)
                .catch((error) => failure(error))
                // If there is an error, you caught it and transformed it
                // instead into a failure(error) down the success path
        )
        // If there was an error, it is now no longer an error and this
        // mergeMap will just throw that failure(error) away
        .mergeMap(() => Observable.of(
                receive(),
                push('/login')
            )
        )
    )

相反,您应该使用 RxJS 捕获错误,在本例中将其放置在 mergeMap 之后--注意 RxJS 的 catch并 promise catch相似但不是同一件事!

const logoutUserEpic = (action$) => action$
  .ofType(LOGOUT_USER)
  .mergeMap(() =>
    Observable.from(graphQl(AuthLogout))
      .mergeMap(() => Observable.of(
        receive(),
        push('/login')
      ))
      .catch((error) => Observable.of(failure(error)))
  )

关于redux - 测试 redux-observable 史诗的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692850/

相关文章:

angular - 可观察到的 ExpressionChangedAfterItHasBeenCheckedError

typescript - RXJS bufferedAmount/累加值/减少并重置

javascript - rxjs5 toPromise 不工作

reactjs - 在 redux-observable 中 - 如何调度操作 "mid-stream"而不返回该操作的值?

javascript - 从另一个组件 react 更新组件

reactjs - 如何模拟 redux 表单的 getFormValues

javascript - 如何连接到源?

rxjs - 如何在 RxJs 5 中将 Subject 转换为 Observable

javascript - 将新 Prop 合并到状态中的正确方法

reactjs - 为什么初始状态为null时createSlice会报错?