Тестирование действий (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,
},
],
});
});
});