Я создаю веб-приложение, используя React и Redux Observables, и я хотел бы создать модульный тест для сценария тайм-аута одного из моих эпосов.
Вот эпос:
export const loginUserEpic = (action$: ActionsObservable<any>, store, { ajax, scheduler }): Observable<Action> =>
action$.pipe(
ofType<LoginAction>(LoginActionTypes.LOGIN_ACTION),
switchMap((action: LoginAction) =>
ajax({
url,
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: { email: action.payload.username, password: action.payload.password },
}).pipe(
timeout(timeoutValue, scheduler),
map((response: AjaxResponse) => loginSuccess(response.response.token)),
catchError((error: Error) => of(loginFailed(error))),
),
),
);
А вот мой тест:
it('should handle a timeout error', () => {
// My current timeout value is 20 millseconds
const inputMarble = '------a';
const inputValues = {
a: login('fake-user', 'fake-password'),
};
const outputMarble = '--b';
const outputValues = {
b: loginFailed(new Error('timeout')),
};
const ajaxMock = jest.fn().mockReturnValue(of({ response: { token: 'fake-token' } }));
const action$ = new ActionsObservable<Action>(ts.createHotObservable(inputMarble, inputValues));
const outputAction = loginUserEpic(action$, undefined, { ajax: ajaxMock, scheduler: ts });
// I am not sure what error to expect here...
ts.expectObservable(outputAction).toBe(outputMarble, outputValues);
ts.flush();
expect(ajaxMock).toHaveBeenCalled();
});
Я ожидал, что Epic выдаст ошибку тайм-аута, потому что у меня значение тайм-аута составляет 20 мс, а наблюдатель откладывает 60 мсек, прежде чем выдавать значение.Затем я бы взял эту ошибку и в конце сравнил ее, чтобы пройти тест.
К сожалению, ошибка тайм-аута не выдается.Я что-то не так делаю?