2017-01-17 8 views
2

Я получил этот 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 отлично работает.

ответ

2

По-видимому, использование jest.mock('redux-saga',() =>() => ({ run: jest.fn() })) - это правильный способ издеваться над функцией createSagaMiddleware.

+1

Нет необходимости делать функцию шпионом, если вы не хотите ее тестировать, поэтому это должно работать также: 'jest.mock ('redux-saga',() =>() => ({run: jest.fn()})) ' –

+0

Вы правы, я отредактирую его. Спасибо, что обратились к нам! – Dani