redux-observable epic
でretryWhen
オペレータをテストする方法に苦労しています。 this exampleをdocsから取ったところで、私はthis jsbinをフォークしました。ここで、応答が2回失敗した後、有効な応答を返すケースをテストしようとしています。RxJS Redux-Observables叙事詩の中でテストretryWhen
以下はコードの一部です。あなたはいつもempty
、アレイ内の実際の行動をjsbinで応答を確認した場合、全体の実装について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]
});
});
...
});
を使用してください。
こんにちは!あなたはあなたの再試行を試してみましたか?誰かが私を助けてくれるのは難しいかもしれません。あるいは、すべてを理解するために些細な時間を費やす必要があるかもしれません。 – jayphelps
@jayphelpsご返信ありがとうございます。この問題は、 'retry'や' retryWhen'を使って、最初からアクション全体をやり直して、内側のajax observable(switchMapの内側)を再試行するのではなく、再試行しているようです。上記の例に基づいてテストを行いました。リトライ回数( ' .retry(3) ')、または応答の大理石(' response:[' - #a |' ')を変更すると、実際のフレームはフレームと再試行回数の乗算であることがわかります。 – stelioschar