背景:
我创建了一个自定义钩子,useModal()
用于包装一些用于在应用程序周围创建/销毁模式的状态:
import { useState } from "react";
export default function useModal(){
let [isShow, setIsShow] = useState(false);
let [modalTitle, setModalTitle] = useState("");
let [modalContent, setModalContent] = useState("");
const showModal = (title = false, content = false) => {
setIsShow(true);
if (title) setModalTitle(title);
if (content) setModalContent(content);
};
const hideModal = () => {
setIsShow(false);
setModalContent("");
setModalTitle("");
};
return { isShow, showModal, hideModal, modalTitle, modalContent };
};
该钩子在应用程序周围使用时工作得非常好,但是当尝试使用 Jest 在它周围添加一些单元测试时,它会在尝试从钩子访问任何返回的项目时抛出以下错误:
Invalid hook call. Hooks can only be called inside of the body of a function component
这是单元测试:
import useModal from "./useModal";
import { renderHook, act } from "@testing-library/react-hooks";
describe("When modal is shown", () => {
it("IsShow should be true", () => {
const { result } = renderHook(() => useModal());
act(() => {
result.current.showModal("A title", "Some content");
})
expect(result.current.isShow).toBe(true);
});
});
尝试的事情:
我对这个问题的所有阅读都表明这是功能组件安装方式的问题,因此,安装@testing-library/react-hooks
提供包装器的包来解决这个问题
https://react-hooks-testing-library.com/usage/basic-hooks
使用的软件包版本:
"@types/jest": "^27.4.0"
"@testing-library/jest-dom": "^5.16.2"
"@testing-library/react": "^12.1.2"
"@testing-library/react-hooks": "^7.0.2"
"react": "^17.0.2"
"react-dom": "^17.0.2"