2
我正在努力如何測試retryWhen
運營商在redux-observable epic
。基於this example取自docs,我叉了this jsbin我試圖測試的情況下,響應失敗2次,之後,它返回一個有效的響應。RxJS Redux-Observables測試重試當在一個史詩
以下是部分代碼。對於整個實施,請使用this jsbin
let RetryStrategy = attempts => attempts
.zip(Observable.range(1, 4))
.flatMap(([error, i]) => {
if (i > 3) {
return Observable.throw('Network error occured')
}
return Observable.timer(i * 1000)
})
const fetchFooEpic = (action$, store, call = indirect.call) =>
action$.ofType('FETCH_FOO')
.mergeMap(action =>
call(api.fetchFoo, action.payload.id)
.map(payload => ({ type: 'FETCH_FOO_FULFILLED', payload }))
.retryWhen(RetryStrategy)
.takeUntil(action$.ofType('FETCH_FOO_CANCELLED'))
.catch(error => of({
type: 'FETCH_FOO_REJECTED',
payload: error.xhr.response,
error: true
}))
);
describe('fetchFooEpic',() => {
...
it.only('handles errors correctly',() => {
const badResponse = { message: 'BAD STUFF' };
const response = { id: 123, name: 'Bilbo' };
expectEpic(fetchFooEpic, {
expected: ['-----a|', {
a: { type: 'FETCH_FOO_FULFILLED', payload: response }
}],
action: ['(a|)', {
a: { type: 'FETCH_FOO', payload: { id: 123 } }
}],
response: ['-#-#-a|', {
a: response
}, { xhr: { badResponse } }],
callArgs: [api.fetchFoo, 123]
});
});
...
});
如果您在jsbin中總是empty
陣列的實際行動響應。
您好!你有沒有嘗試過測試你的重試?當沒有其他所有東西和所有抽象?因爲我或他們需要花費大量的時間來了解所有的事情,所以有人可能很難幫助你。 – jayphelps
@jayphelps感謝您的快速回復。問題似乎是,當使用'retry'或'retryWhen'重試從一開始執行整個操作時,不僅僅是重試內部ajax observable(在switchMap中)。我根據上面的例子做了很多測試,你可以看到[這裏](http://jsbin.com/hekener/36/edit?js,output),如果你試圖改變重試次數(' .retry(3)')或更改大理石響應('response:[' - #a |''),您可以看到實際的幀是幀數和重試次數的乘積。 – stelioschar