Тестирование Thunk с использованием mockStore с getState()
У меня проблемы с тестированием thunk с помощью mock-store.
В моем thunk я вызываю getState(), чтобы получить состояние хранилища с избыточностью, а затем отправляю действия в зависимости от состояния.
Как мне получить вызов thSnks getState() для проверки состояния фиктивных хранилищ, а не состояния избыточного хранилища?
import {initialState} from '../configureStore'
import {saveAndSendTask} from '../thunks/queueThunk'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import * as actions from '../actions/index'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
describe('Testing TaskQueue Thunk', () => {
const store = mockStore(initialState)
test('Test TaskQueue thunk sends to sever and removes from queue.', () => {
// removed variables test data for the sake of brevity.
// Add actions to Mock Store and set up Base state needed to test.
store.dispatch(actions.addToTaskQueue(task1))
store.dispatch(actions.addToTaskQueue(task2))
store.dispatch(actions.setTasks([task1, task2, task3]))
store.dispatch(actions.selectTask(task3.id))
store.dispatch(actions.isConnected(true))
// This is the thunk I want to test.
store.dispatch(saveAndSendTask())
expect('something').toEqual('something')
})
)}
Вот тот, который я хочу проверить.
export const saveAndSendTask = (): any => {
return (dispatch: Dispatch, getState) => {
// This state is the same as initial state of redux store. Ignores Mock store state.
console.log(getState())
// Selected task is undefined.
dispatch(addToTaskQueue(getState().tasks.selectedTask))
// ....rest of logic.....
}
}
1 ответ
redux-mock-store
не обновляет состояние, а только записывает действия, переданные диспетчеру.
Кроме того, код, реализующий getState
Метод в библиотеке возвращает либо пройденное начальное состояние, либо функцию.
getState () {
return isFunction(getState) ? getState(actions) : getState
}
Согласно документации:
Обратите внимание, что эта библиотека предназначена для проверки логики, связанной с действием, а не логики, связанной с редуктором. Другими словами, он не обновляет магазин Redux. Если вы хотите сложный тест, объединяющий действия и редукторы вместе, взгляните на другие библиотеки (например, redux-actions-assertions). Обратитесь к вопросу № 71 для получения более подробной информации.
Вы можете либо попробовать другую библиотеку, следуя рекомендациям, указанным в #71, передавая действия вашему редуктору вручную, чтобы получить обновленное состояние, которое вы ожидали, либо изменить свою спецификацию для проверки действия, отправленного в saveAndSendTask
используя ожидаемое предыдущее состояние для инициализации вашего mockStore.