0

rxjs オブザーバーの catch 関数をテストしようとしていますが、catch が実行されません。

test.js

it.only('On fail restore password', () => {
    sandbox = sinon.stub(Observable.ajax, 'post').returns(new Error());
    store.dispatch(restorePasswordVi('prueba'));
    expect(store.getActions()).toInclude({ success: false, type: SET_RESTORE_PASSWORD_SUCCESS });
  });

エピックはhttps://redux-observable.js.org/を参照してください

export function restorePasswordViEpic(action$: Observable<Action>, store: Store) {
  return action$
    .ofType(RESTORE_PASSWORD_VI)
    .switchMap(({ user }) => {
      store.dispatch(blockLoading(true));
      return Observable
       .ajax
       .post(`${config.host}/auth/restore-password`, { user })
         .map(() => setRestorePasswordSuccess(true))
         .catch(() => {
           return Observable.of(setMessage('Se ha producido un error por favor intente de nuevo.'));
         });
    });
}
4

1 に答える 1

3

のスタブは、エラーをスローObservable.ajax.postする を返す必要があります。Observable

.returns(Observable.throw(new Error()));

すべて一緒に:

it.only('On fail restore password', () => {
  sandbox = sinon.stub(Observable.ajax, 'post').returns(Observable.throw(new Error()));
  store.dispatch(restorePasswordVi('prueba'));
  expect(store.getActions()).toInclude({ success: false, type: SET_RESTORE_PASSWORD_SUCCESS });
});

既存のスタブは Error オブジェクト自体 (エラーをスローするオブザーバブルではない) のみを返すため、次のようなキャッチされていないエラーがスローされるはずです。

Uncaught TypeError: Observable.ajax.post(...).map is not a function

テストを実行したときにそのようなエラーが表示されない場合は、どこかでエラーを黙って飲み込んでいる可能性があるため、注意が必要です。

于 2016-12-07T19:13:26.003 に答える