Если заглушить axios.post(...)
как []
, вы получите from([])
в эпопее - пустую наблюдаемую область, которая не испускает никаких значений.Вот почему ваш mergeMap
никогда не называется.Вы можете исправить это, используя вместо этого одноэлементный массив, например, [null]
или [{}]
.
Ниже приведен ответ на предыдущую версию вопроса.Я сохранил это для справки, и потому, что я думаю, что контент полезен для тех, кто пытается высмеять функции, возвращающие обещание, в эпических тестах.
Я думаю, что ваша проблема - from(axios.post(...))
в вашем эпосе.Axios возвращает обещание, а RxJS TestScheduler
не имеет возможности сделать это синхронным, поэтому expectObservable
не будет работать так, как задумано.
Обычно я обращаюсь к этому, чтобы создать простой модуль-обертку, который делаетОбещание в наблюдаемое преобразование.В вашем случае это может выглядеть следующим образом:
// api.js
import axios from 'axios';
import { map } from 'rxjs/operators';
export function post(path, data) {
return from(axios.post(path, options));
}
Как только вы получите эту обертку, вы можете смоделировать функцию, возвращающую постоянную Observable
, полностью исключая обещания из картинки.Если вы сделаете это с Jest, вы можете напрямую смоделировать модуль:
import * as api from '../api.js';
jest.mock('../api.js');
// In the test:
api.post.mockReturnValue(of(/* the response */));
В противном случае вы также можете использовать механизм вставки зависимостей для ввода-вывода, чтобы внедрить модуль API.Ваш эпос получит его в качестве третьего аргумента:
export const updateRemoteFieldEpic = (action$, state, { api }) =>
action$.pipe(
ofType(UPDATE_REMOTE_FIELD),
filter(({ payload: { update = true } }) => update),
mergeMap(({ payload }) => {
// ...
return api.post(...).pipe(...);
})
);
В вашем тесте вы просто передадите поддельный api
объект.