ofType не является функцией при тестировании с мраморными диаграммами rxjs - PullRequest
0 голосов
/ 17 октября 2018

Я использую rxjs 6 с редукс-наблюдаемой 1 и пишу тест для эпического

const signInEpic = action$ =>
  action$
    .ofType(authActions.signIn)
    .pipe(
      switchMap(mapSignInAction$)
    )

Я использую TestScheduler для тестирования по мраморным диаграммам и при запуске теста возвращает ошибку action$.ofType is not a function

тест:

import { TestScheduler } from 'rxjs/testing'

const scheduler = new TestScheduler((actual, expected) => {
  expect(actual).toEqual(expected)
})

scheduler.run(({ cold, hot, expectObservable }) => {
    const action$ = hot('-a', { a: { type: 'HFJKDHF' } })
    const state$ = null
    const output$ = signInEpic(action$, state$)

    expectObservable(output$).toBe('--b', {
      b: actions.signInSuccess(response)
    })
  })

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вместо action$.ofType нужно использовать action$.pipe(ofType(...), ...)

import { ofType } from 'redux-observable'

action$
    .pipe(
      ofType(authActions.signIn),
      switchMap(mapSignInAction$)
    )
0 голосов
/ 17 октября 2018

Ошибка правильная, потому что вы создаете hot() Observable и затем передаете его в метод signInEpic.Но .ofType не существует в классе Observable, этот метод специфичен для redux-observable.

Просто быстро просматривая исходный код, вы можете создать макет $actions Observable самостоятельно:

https://github.com/redux-observable/redux-observable/blob/master/src/ActionsObservable.js

Например, вот так:

import { ActionsObservable } from 'redux-observable';

scheduler.run(({ cold, hot, expectObservable }) => {
  const source = hot('-a', { a: { type: 'HFJKDHF' } });
  const actions$ = ActionsObservable.of(source);

  const state$ = null
  const output$ = signInEpic(action$, state$)

  expectObservable(output$).toBe('--b', {
    b: actions.signInSuccess(response);
  });
});
...