Тестирование fork() в Redux Saga с Jest

113
7

В настоящее время я пытаюсь создать некоторые модульные тесты для моей саги "getExchanges", но, просмотрев некоторые документы и сайты, я обнаружил, что в этой области недостаточно информации о запуске модульных тестов.

Ниже моя сага, которую я пытаюсь протестировать и любой код, окружающий ее. Цель состоит в том, чтобы проверить, правильно ли работает сага и убедиться, что API извлекает информацию так, как должно.

Получить Обмен Сага

export function* getExchanges(action) {
const state: storeType = yield select()
yield fork(async, action, API.getExchanges, { userId: state.auth.userId })
}

Ссылка 'async' в форке yield выше

import { put, call } from 'redux-saga/effects'

import { asyncAction } from './asyncAction'

export const delay = ms => new Promise(res => setTimeout(res, ms))

/**
* @description: Reusable asynchronous action flow
*
* @param action : redux action
* @param apiFn : api to call
* @param payload : payload to send via api
*/
export function* async(action, apiFn, payload) {
const async = asyncAction(action.type)
try {
const { response, data } = yield call(apiFn, payload)
console.log('[Saga-API_SUCCEED - ${action.type}, ${response}, ]: , ${data}')
yield put(async.success(data))
} catch (err) {
console.log('[Saga-API_FAILED: - , ${action.type}, ]: , ${err}')
yield put(async.failure(err))
}
}

Действие getExchanges

export const getExchanges = () => action(actionTypes.GET_EXCHANGES.REQUEST, {})

GET_EXCHANGES Тип действия

export const GET_EXCHANGES = createAsyncActionTypes('GET_EXCHANGES')

asyncAction (оборачивает действие getExchanges с помощью action() и оборачивает GET_EXCHANGES с помощью createAsyncActionTypes)

export type ASYNC_ACTION_TYPE = {
REQUEST: string
SUCCESS: string
FAILURE: string,
}

export const createAsyncActionTypes = (baseType: string): ASYNC_ACTION_TYPE => {
return {
REQUEST: '${baseType}',
SUCCESS: '${baseType}_SUCCESS',
FAILURE: '${baseType}_FAILURE',
}
}

export function action(type, payload = {}) {
return { type, payload }
}

export function asyncAction(actionType: string) {
const asyncActionType = createAsyncActionTypes(actionType)
return {
success: response => action(asyncActionType.SUCCESS, response),
failure: err => action(asyncActionType.FAILURE, err),
}
}

API getExchanges

 export const getExchanges = ({ userId }) => API.request('/exchange/${userId}', 'GET')

Мой удар по тесту

    import configureMockStore from 'redux-mock-store'
import { runSaga } from 'redux'
import createSagaMiddleware from 'redux-saga'
import { exchangesSaga, getExchanges ,getBalances, selectExchange } from '../src/sagas/exchanges.saga'
import * as api from '../src/api/transaction'
import * as actionTypes from '../src/action-types/exchanges.action-types'
import { action } from '../src/sagas/asyncAction'

const sagaMiddleware = createSagaMiddleware()
const mockStore = configureMockStore([sagaMiddleware]);

export async function recordSaga(saga, initialAction) {
const dispatched = [];

// Run a given saga outside of the middleware
await runSaga(
{
// dispatch fulfills put
dispatch: (action) => dispatched.push(action)
},
saga,
initialAction
).done;

return dispatched;
}

describe.only("getExchanges saga", () => {
api.getExchanges = jest.fn()
beforeEach(() => {
jest.resetAllMocks()
})

it('should get exchanges from API and call success action', async () => {
const getUserExchanges = {exchange, exchange2};
api.getExchanges.mockImplementation(() => getExchanges);

const initialAction = action(actionTypes.GET_EXCHANGES.REQUEST)
const dispatched = await recordSaga(
getExchanges,
initialAction
);

expect(api.getExchanges).toHaveBeenCalledWith(1);
expect(dispatched).toContainEqual(action(actionTypes.GET_EXCHANGES.SUCCESS));
});
})

В настоящее время я не получаю многого из своего тестового примера, поскольку он неполон, и я немного растерялся, как мне поступить.

Я ожидаю, что смогу вернуть тест и убедиться, что API правильно извлекает информацию, используя фиктивные данные.

спросил(а) 2019-04-10T04:59:00+03:00 1 год, 2 месяца назад
1
Решение
86

Я рекомендую план редукса-саги-теста.

Это позволяет вам ожидать, что получаются определенные эффекты, и позволяет вам высмеивать любой эффект.

ответил(а) 2019-04-10T14:54:00+03:00 1 год, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема