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