Не проходит тест кастомного хука. Почему-то тест не получает обновлённое состояние

Почему-то не тест не получает новое состояние.

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.

Ответы (0 шт):