Я получил этот configureStore.js, который конфигурирует мой расширенный магазин Redux и сохраняется его к LocalStorage:Mock перевождите сагу промежуточного слой с Jest
// @flow
import 'babel-polyfill'
import { addFormSubmitSagaTo } from 'redux-form-submit-saga/es/immutable'
import { applyMiddleware, createStore, compose } from 'redux'
import { autoRehydrate, persistStore } from 'redux-persist-immutable'
import { browserHistory } from 'react-router'
import { combineReducers } from 'redux-immutable'
import { fromJS } from 'immutable'
import { routerMiddleware } from 'react-router-redux'
import createSagaMiddleware from 'redux-saga'
import rootReducer from './reducers'
import sagas from './sagas'
export default function configureStore() {
const initialState = fromJS({ initial: { dummy: true } })
const sagaMiddleware = createSagaMiddleware()
const middleware = [ routerMiddleware(browserHistory), sagaMiddleware ]
const enhancer = compose(
autoRehydrate(),
applyMiddleware(...middleware),
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__()
)
const store = createStore(
combineReducers(rootReducer),
initialState,
enhancer
)
// Persist store to the local storage
persistStore(store, { blacklist: [ 'form', 'routing' ] })
// Decorate with Redux Form Submit Saga
// and create hook for saga's
const rootSaga = addFormSubmitSagaTo(sagas)
sagaMiddleware.run(rootSaga)
return store
}
Теперь я пытаюсь проверить этот файл, используя шутя:
import configureStore from './../configureStore'
import * as reduxPersistImmutable from 'redux-persist-immutable'
import * as redux from 'redux'
import createSagaMiddleware from 'redux-saga'
describe('configureStore',() => {
it('persists the store to the localStorage',() => {
reduxPersistImmutable.persistStore = jest.fn()
redux.createStore = jest.fn()
createSagaMiddleware.default = jest.fn(() => {
run:() => jest.fn()
})
configureStore()
})
})
Все проходит гладко в этом тесте, пока configureStore не достигнет линии sagaMiddleware.run(rootSaga)
. Он выдает следующее сообщение об ошибке:
FAIL app/__tests__/configureStore.js
● Console
console.error ../node_modules/redux-saga/lib/internal/utils.js:206
uncaught at check Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware
● configureStore › persists the store to the localStorage
Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware
at check (../node_modules/redux-saga/lib/internal/utils.js:50:11)
at Function.sagaMiddleware.run (../node_modules/redux-saga/lib/internal/middleware.js:87:22)
at configureStore (app/configureStore.js:38:18)
at Object.<anonymous> (app/__tests__/configureStore.js:17:60)
at process._tickCallback (../internal/process/next_tick.js:103:7)
Эта ошибка указывает на то, что издеваться функция не работает, как я намерен: это, кажется, не будут перезаписаны и вызывается из Redux-саги. Mocking redux.createStore отлично работает.
Нет необходимости делать функцию шпионом, если вы не хотите ее тестировать, поэтому это должно работать также: 'jest.mock ('redux-saga',() =>() => ({run: jest.fn()})) ' –
Вы правы, я отредактирую его. Спасибо, что обратились к нам! – Dani