Тестирование действий (actions) и редьюсеров (reducers) в Redux с использованием Jest — это важный аспект разработки, который помогает убедиться, что ваше Redux-приложение работает правильно. Вот как это можно сделать:

1. Тестирование actions:

Действия (actions) — это обычные JavaScript-объекты, которые описывают, что произошло в приложении. Создатели действий (action creators) — это функции, которые возвращают эти объекты.

Пример создателя действия:

// actions.js
export const incrementCount = () => ({
  type: 'INCREMENT_COUNT',
});

Пример тестового файла для создателя действия:

// actions.test.js
import { incrementCount } from './actions';
 
describe('actions', () => {
  it('should create an action to increment the count', () => {
    const expectedAction = {
      type: 'INCREMENT_COUNT',
    };
    expect(incrementCount()).toEqual(expectedAction);
  });
});

2. Тестирование reducers:

Редьюсеры (reducers) — это чистые функции, которые принимают текущее состояние и действие и возвращают новое состояние.

// reducers.js
const initialState = {
  count: 0,
};
 
export const countReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT_COUNT':
      return {
        ...state,
        count: state.count + 1,
      };
    default:
      return state;
  }
};
// reducers.test.js
import { countReducer } from './reducers';
 
describe('countReducer', () => {
  it('should return the initial state', () => {
    expect(countReducer(undefined, {})).toEqual({ count: 0 });
  });
 
  it('should handle INCREMENT_COUNT', () => {
    expect(countReducer({ count: 0 }, { type: 'INCREMENT_COUNT' })).toEqual({ count: 1 });
  });
});

3. Тестирование сложных действий и редьюсеров:

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

// actions.js
export const addTodo = (text) => ({
  type: 'ADD_TODO',
  text,
});

Пример тестового файла для сложного создателя действия:

// actions.test.js
import { addTodo } from './actions';
 
describe('actions', () => {
  it('should create an action to add a todo', () => {
    const text = 'Finish docs';
    const expectedAction = {
      type: 'ADD_TODO',
      text,
    };
    expect(addTodo(text)).toEqual(expectedAction);
  });
});

Пример сложного редьюсера:

// reducers.js
const initialState = {
  todos: [],
};
 
export const todosReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'ADD_TODO':
      return {
        ...state,
        todos: [
          ...state.todos,
          {
            text: action.text,
            completed: false,
            id: state.todos.length,
          },
        ],
      };
    default:
      return state;
  }
};

Пример тестового файла для сложного редьюсера:

// reducers.test.js
import { todosReducer } from './reducers';
 
describe('todosReducer', () => {
  it('should return the initial state', () => {
    expect(todosReducer(undefined, {})).toEqual({ todos: [] });
  });
 
  it('should handle ADD_TODO', () => {
    expect(
      todosReducer(
        { todos: [] },
        {
          type: 'ADD_TODO',
          text: 'Run the tests',
        }
      )
    ).toEqual({
      todos: [
        {
          text: 'Run the tests',
          completed: false,
          id: 0,
        },
      ],
    });
  });
});

Назад