Я использую шаблон утки и redux-persist , чтобы настроить хранилище редуксов следующим образом:
store/index.js
/* import staments */
const persistConfig = {
key: 'root',
storage,
};
const ducks = {
auth,
password,
navbar,
tasks,
};
const reducer = ducksReducer(ducks);
const middleware = applyMiddleware(ducksMiddleware(reducer));
const persistedReducer = persistReducer(persistConfig, reducer);
export const store = createStore(persistedReducer, composeWithDevTools(middleware));
export const persistor = persistStore(store);
Приложение работает нормально и все тесты проходят успешно, но когда я экспортирую переменную store
(пытаюсь отправить действие) в файл, не относящийся к React, тест завершается.
utils/http.js
// Commenting this line will make things work perfectly fine
import { store } from '../store'; /
import { stopSession } from '../store/modules/session';
...
const handleResponse = (response, onSuccess, onFail) => {
if (response.status >= 200 && response.status < 300) {
return onSuccess();
}
// 401 Unauthorized when session expires.
if (response.status === 401) {
response.text().then(message => store.dispatch(stopSession(message)));
}
return onFail();
};
...
Все редукторы имеют начальные состояния, которые не определены, все операторы switch
имеют значения по умолчанию. Приложение работает отлично, только тестам не нравится, когда магазин экспортируется и используется так.
Обновлено : вот урезанный auth
редуктор:
ПРИМЕЧАНИЕ: не только auth
редуктор ломается, каждый редуктор есть.
import http from '../../utils/http';
// Actions
export const LOGIN_RESET = 'LOGIN_RESET';
// ... more actions
// Actions creators
export const login = (email, password) => ({ type: LOGIN_REQUEST, email, password });
// ... more action creators
// Selectors
export const loginLoading = ({ auth }) => auth.loginStatus === 'loading';
export const getUser = ({ auth }) => auth.user;
// ... more selectors
const initialState = {
loginStatus: null,
signupStatus: null,
signupErrors: [],
logoutStatus: null,
userLoggedIn: false,
user: {},
};
export default function reduce(state = initialState, action = {}) {
switch (action.type) {
case LOGIN_RESET:
return {
...state,
loginStatus: null,
};
// ... more cases
default:
return state;
}
}
// Middleware
export const middleware = ({ dispatch }) => next => async (action) => {
next(action);
switch (action.type) {
case LOGIN_REQUEST: {
const { email, password } = action;
const response = await http.post('users/sign_in', {
user: { email, password },
});
http.handleResponse(
response,
async () => {
const user = await response.json();
return dispatch({
type: LOGIN_SUCCESS,
user,
});
},
() => dispatch({ type: LOGIN_FAILURE })
);
break;
}
// ... more cases
return null;
};
Вот скриншот запущенных тестов:
Честно говоря, я не вижу ничего плохого в редукторах или настройках магазина. Это может быть связано с самим ферментом, когда он пытается отобразить приложение из магазина undefined
. Если я уберу оператор импорта в http.js
, все будет работать нормально.