Модульный тест Redux Action — количество не определено

#javascript #reactjs #react-native #redux #react-redux

#javascript #reactjs #react-native #сокращение #реагировать-сокращение

Вопрос:

Интересно, может ли кто-нибудь указать, чего я ожидаю, это глупая ошибка.

У меня есть действие для входа пользователя в систему.

Я пытаюсь протестировать это действие, я следил за документацией redux, а также за документацией redux-mock-store, однако я продолжаю получать ошибку следующего вида:

 TypeError: Cannot read property 'default' of undefined

      4 | import thunkMiddleware from 'redux-thunk'
      5 | 
    > 6 | const middlewares = [thunkMiddleware] // add your middlewares like `redux-thunk`
        |                      ^
      7 | const mockStore = configureStore(middlewares)
      8 | 
      9 | describe("userActions", () => {

      at Object.thunkMiddleware (actions/user.actions.spec.js:6:22)
  

Мой тестовый код выглядит следующим образом:

 import {userActions} from "./user.actions";
import {userConstants} from "../constants/user.constants";
import configureStore from 'redux-mock-store'
import thunkMiddleware from 'redux-thunk'

const middlewares = [thunkMiddleware] // add your middlewares like `redux-thunk`
const mockStore = configureStore(middlewares)

describe("userActions", () => {
    describe("login", () => {
        it(`should dispatch a ${userConstants.LOGIN_REQUEST}`, () =>{
            const store = mockStore({});
            return store.dispatch(userActions.login("someuser", "somepassword")).then(() => {
                expect(store.getState().loggingIn).toBeTruthy();
            });
        })
    })
});
  

Я дважды проверил, что redux-thunk и redux-mock-store включены в мои зависимости от npm dev, а также удалил каталог node_modules и переустановил их все с помощью npm install.

Кто-нибудь может увидеть, что происходит не так?

Спасибо

Редактировать:

Кажется, я делаю что-то в корне неправильное, я попытался упростить это почти до чистого листа, чтобы найти, где возникла проблема.

Даже с этим тестом:

 import authentication from "./authentication.reducer";
import { userConstants } from "../constants/user.constants";

describe("authentication reducer", () => {

    it("is a passing test", () => {
        authentication();
        expect("").toEqual("");
    });
});
  

Против этого:

 function authentication(){
    return "test";
}
export default authentication
  

Я получаю неопределенную ошибку:

   ● authentication reducer › is a passing test

    TypeError: Cannot read property 'default' of undefined

       6 | 
       7 |     it("is a passing test", () => {
    >  8 |         authentication();
         |         ^
       9 |         expect("").toEqual("");
      10 |     });

      at Object.<anonymous> (reducers/authentication.reducer.spec.js:8:9)
  

Ответ №1:

да, согласно этой ошибке, похоже, у вас проблема с зависимостями модуля. Взгляните на свою webpack конфигурацию.

Что касается redux-mock-store , я предлагаю вам создать помощник для будущих нужд тестирования:

 
import configureStore from 'redux-mock-store'
import thunk from 'redux-thunk'

export default function(middlewares = [thunk], data = {}) {
  const mockedStore = configureStore(middlewares)

  return mockedStore(data)
}

  

и вы включите его в свои тестовые примеры и будете использовать подобным образом:

 beforeEach(() => {
  store = getMockStore()
})

afterEach(() => {
  store.clearActions()
})

  

Комментарии:

1. Я использую expo и babel. Как вы думаете, это может быть проблемой конфигурации babel?

2. Определенно, это проблема с конфигурацией. default означает импорт по умолчанию. Я думаю, вам нужно исследовать проблему внутри babel.

Ответ №2:

Если вы не хотите тестировать redux с помощью thunk, вы можете использовать для этого модуль redux-thunk-tester.

Пример:

 import React from 'react';
import {createStore, applyMiddleware, combineReducers} from 'redux';
import {asyncThunkWithRequest, reducer} from './example';
import ReduxThunkTester from 'redux-thunk-tester';
import thunk from 'redux-thunk';

const createMockStore = () => {
  const reduxThunkTester = new ReduxThunkTester();

  const store = createStore(
    combineReducers({exampleSimple: reducer}),
    applyMiddleware(
      reduxThunkTester.createReduxThunkHistoryMiddleware(),
      thunk
    ),
  );

  return {reduxThunkTester, store};
};

describe('Simple example.', () => {
  test('Success request.', async () => {
    const {store, reduxThunkTester: {getActionHistoryAsync, getActionHistoryStringifyAsync}} = createMockStore();

    store.dispatch(asyncThunkWithRequest());

    const actionHistory = await getActionHistoryAsync(); // need to wait async thunk (all inner dispatch)

    expect(actionHistory).toEqual([
      {type: 'TOGGLE_LOADING', payload: true},
      {type: 'SOME_BACKEND_REQUEST', payload: 'success response'},
      {type: 'TOGGLE_LOADING', payload: false},
    ]);

    expect(store.getState().exampleSimple).toEqual({
      loading: false,
      result: 'success response'
    });

    console.log(await getActionHistoryStringifyAsync({withColor: true}));
  });
});