Не проходит тест кастомного хука. Почему-то тест не получает обновлённое состояние
Почему-то не тест не получает новое состояние.
import { useEffect, useState } from "react";
import { ITask } from "../types/task.interface";
const useTasks = () => {
const [tasks, setTasks] = useState<ITask[]>([]);
const addNewTask = (value: string) => {
const newTask: ITask = {
id: tasks && tasks.length ? tasks[tasks.length - 1].id + 1 : 0,
isDone: false,
title: value,
};
setTasks((prevTasks) => [...(prevTasks || []), newTask]);
};
const deleteTask = (id: number) => {
setTasks((prevTasks) => prevTasks.filter((task) => task.id !== id));
};
const toggleDone = (id: number) => {
const copy = [...tasks];
const current = copy.find((item) => item.id === id);
if (current) {
current.isDone = !current.isDone;
}
setTasks(copy);
};
useEffect(() => {
const tasksString = localStorage.getItem("tasks");
const tasks = tasksString ? JSON.parse(tasksString) : [];
setTasks(tasks);
}, []);
useEffect(() => {
localStorage.setItem("tasks", JSON.stringify(tasks));
}, [tasks]);
return {
addNewTask,
deleteTask,
toggleDone,
tasks,
};
};
export default useTasks;
Тесты:
import { act, renderHook } from "@testing-library/react";
import useTasks from "./useTasks";
describe("useTasks", () => {
test("add new tasks", () => {
const { result } = renderHook(() => useTasks());
act(() => {
result.current.addNewTask("Task1");
result.current.addNewTask("Task2");
});
expect(result.current.tasks.length).toBe(2);
});
test("delete a task", () => {
const { result } = renderHook(() => useTasks());
act(() => {
result.current.addNewTask("Task1");
result.current.addNewTask("Task2");
});
act(() => {
result.current.deleteTask(0);
});
expect(result.current.tasks.length).toBe(1);
expect(result.current.tasks[0].title).toBe("Task2");
});
test("toggle task", async () => {
const { result } = renderHook(() => useTasks());
act(() => {
result.current.addNewTask("Task1");
result.current.addNewTask("Task2");
});
act(() => {
result.current.toggleDone(1);
});
expect(result.current.tasks.length).toBe(2);
expect(result.current.tasks[1].isDone).toBe(true);
});
});
Ошибки:
● useTasks › delete a task
expect(received).toBe(expected) // Object.is equality
Expected: 1
Received: 2
21 | result.current.deleteTask(0);
22 | });
> 23 | expect(result.current.tasks.length).toBe(1);
| ^
24 | expect(result.current.tasks[0].title).toBe("Task2");
25 | });
26 |
at Object.<anonymous> (src/hooks/useTasks.test.js:23:41)
at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13)
at runJest (node_modules/@jest/core/build/runJest.js:404:19)
● useTasks › toggle task
expect(received).toBe(expected) // Object.is equality
Expected: 2
Received: 4
34 | result.current.toggleDone(1);
35 | });
> 36 | expect(result.current.tasks.length).toBe(2);
| ^
37 | expect(result.current.tasks[1].isDone).toBe(true);
38 | });
39 | });
at Object.<anonymous> (src/hooks/useTasks.test.js:36:41)
at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13)
at runJest (node_modules/@jest/core/build/runJest.js:404:19)
Test Suites: 1 failed, 1 total
Tests: 2 failed, 1 passed, 3 total
Snapshots: 0 total
Time: 2.159 s, estimated 3 s
Ran all test suites related to changed files.