这里我使用的是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/