ofType不是使用rxjs大理石图进行测试的功能

时间:2018-10-17 10:07:00

标签: redux rxjs rxjs6 redux-observable

我正在将rxjs 6与redux-observable 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 :(得分:1)

该错误是正确的,因为您创建了hot()可观察的对象,然后将其传递给signInEpic方法。但是.ofType在Observable类上不存在,该方法特定于redux-observable

通过快速查看源代码,您可以创建一个$actions自己可以观察的模拟:

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);
  });
});

答案 1 :(得分:1)

相反,action$.ofType需要使用action$.pipe(ofType(...), ...)

import { ofType } from 'redux-observable'

action$
    .pipe(
      ofType(authActions.signIn),
      switchMap(mapSignInAction$)
    )