Экспорт Redux Store не проходит ферментные тесты - PullRequest
0 голосов
/ 30 октября 2018

Я использую шаблон утки и 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;
};

Вот скриншот запущенных тестов:

Enzyme tests fail

Честно говоря, я не вижу ничего плохого в редукторах или настройках магазина. Это может быть связано с самим ферментом, когда он пытается отобразить приложение из магазина undefined. Если я уберу оператор импорта в http.js, все будет работать нормально.

1 Ответ

0 голосов
/ 10 ноября 2018

Оказывается, нет ничего плохого в настройках магазина или редукторах. Я смог решить эту проблему, создав фиктивный файл http.js, чтобы сделать энзим счастливым.

Итак, в конфиге корневого уровня index.js (в папке __test__) скажите jest инициализировать макет из файла:

/* /src/__tests__/index.js */

import Adapter from 'enzyme-adapter-react-16';
import { configure } from 'enzyme';

configure({ adapter: new Adapter() });

jest.mock('../utils/http.js');

И в том же месте файла http.js добавьте фиктивный файл (должен быть внутри __mocks__)

/* /src/utils/__mocks__/http.js */

const http = {};
export default http;

Проблема заключается в том, что при запуске тестов Enzyme загружает http.js, и в этот момент хранилище еще не настроено. Возможно, мне не следует отправлять действия в http-помощник, для этого лучше использовать промежуточное ПО. Я не уверен, является ли это решение хорошей практикой, поэтому любые комментарии / предложения приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...