【发布时间】:2021-04-19 03:33:05
【问题描述】:
我想测试一个子组件,但它依赖于父组件的状态(挂钩)。
孩子接收isModalOpen 和setIsModalOpen 作为属性。每次isModalOpen 更改时,Child 内部的useEffect 都会触发。但是,当我尝试单独测试Child 组件时,我无法强制更改触发useEffect 挂钩的状态更改。如何在测试环境中不必渲染Parent 来实现这一点?
在下面的示例中,我可以通过渲染Parent 使测试通过。我只想渲染Child,仍然让测试通过。
function Child({ isModalOpen, setIsModalOpen }) {
useEffect(() => {
console.log("is the modal open?", isModalOpen);
}, [isModalOpen]);
return (
<button data-testId="myBtn" onClick={() => setIsModalOpen(!isModalOpen)}>
Click to {isModalOpen ? "close" : "open"} modal
</button>
);
}
function Parent() {
const [isModalOpen, setIsModalOpen] = useState(false);
return <Child isModalOpen={isModalOpen} setIsModalOpen={setIsModalOpen} />;
}
测试:
it("React test", () => {
let isModalOpen = false;
const mockFunction = jest.fn((val) => (isModalOpen = val));
const { queryByTestId } = render(
<Child isModalOpen={isModalOpen} setIsModalOpen={mockFunction} />
);
const btnEl = queryByTestId("myBtn");
btnEl.click();
expect(btnEl.innerHTML).toEqual("Click to close modal");
// -----
// -----
// -----
// ----- The below code works
// const { queryByTestId } = render(<Parent />);
// const btnEl = queryByTestId("myBtn");
// btnEl.click();
// expect(btnEl.innerHTML).toEqual("Click to close modal");
});
以下是上述代码 sn-p 的工作示例: https://codesandbox.io/s/jest-test-forked-cjm3r?file=/index.test.js
【问题讨论】: