Я довольно новичок в наблюдении за редуксом, поэтому я не уверен, является ли это реальной проблемой или просто глупой ошибкой.
Я пытаюсь добавить тест к эпосам, которые я написал для Reactприложения, но я не могу их проверить. Вот пример.
Мой пример эпоса:
const example = action$ =>
action$.pipe(
ofType('my_type'),
mergeMap(() => {
return { type: 'result_type'}
})
);
Я пытался протестировать его самым простым способом:
it('simple test', done => {
const action$ = ActionsObservable.of({ type: 'my_type'});
const state$ = null;
return myEpics.example(action$, state$)
.subscribe(actions => {
expect(actions).toEqual({ type: 'result_type'});
done();
})
});
Используя этот код, я получаюследующая ошибка:
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
12 |
13 | return myEpics.example(action$, state$)
> 14 | .subscribe(actions => {
| ^
Я использую наблюдаемую приставку 1.2.0, rxjs 6.5.3
Я что-то пропустил? Я видел много примеров этого типа, и они работают.
РЕДАКТИРОВАТЬ
То, что я действительно делаю (кроме фиктивного примера), заменяет обещание с избыточным количеством словпромежуточное программное обеспечение на основе API (со многими асинхронными вызовами к конечной точке ReST). Я был в состоянии заставить это работать, но о тестировании я немного запутался. Я видел подход с мраморной диаграммой и подписку на эпик, добавляющую ожидания, например, в отношении вызовов API, конечных действий. Я использую последнее, но, например, для эпоса, возвращающего несколько действий, я получаю только первое в подписке.
«сложный» пример:
export const handleLogIn = (action$, state$) =>
action$.pipe(
ofType(authTypes.LOG_IN),
withLatestFrom(state$),
mergeMap(([{ payload: credentials}, { router }]) =>
from(ApiService.logIn(credentials))
.pipe(
mergeMap(authToken => of(authActions.set_auth_token(authToken), navigationActions.goTo(router.location.state ? router.location.state.pathname : baseRoutes.START),
catchError(message => of(authActions.set_auth_error(message)))
)
)
);
Тест
it('should handle LOG_IN navigating to base path', done => {
const token = 'aToken';
const credentials = { username: 'user', password: 'password' };
const action$ = ActionsObservable.of(authActions.log_in(credentials));
const state$ = new StateObservable(new Subject(), { router: { location: { state: null }}});
spyOn(ApiService, 'logIn').and.returnValue(Promise.resolve(token));
authEpics.handleLogIn(action$, state$)
.subscribe(actions => {
expect(ApiService.logIn).toHaveBeenCalledWith(credentials);
expect(actions).toEqual([
authActions.set_auth_token(token),
navigationActions.go_to(baseRoutes.START)
]);
done();
});
});
тест не пройден, поскольку только authActions.set_auth_token является единственным возвращаемым действием. Я что-то упустил?