reactjs 在另一个组件中测试模态组件

yfwxisqw  于 2023-04-20  发布在  React
关注(0)|答案(2)|浏览(111)

我正在尝试测试一个应该打开其模态的组件。模态是这个组件的一部分,但它是用createPortal()呈现的。我首先检查文档中是否存在模态,然后单击按钮,如果它出现了,但测试失败。
组件:

const [openModal, setOpenModal] = useState(false);

function Component() {
  return (
    <div>
      <button onClick={() => setOpenModal(true)}>Open Modal</button>
      <Modal open={openModal}/>
    </div>
  )
}

模态:

const Modal = ({ open, children }) => {
  return createPortal(
    <div style={{display: open ? "block" : "none"}} data-testid="modal">
      {children}
    </div>,
    document.getElementById("modals")
  );
};

测试:

test("component that opens modal", async () => {
  render(<Component />);
  const button = screen.getByText("Open Modal");
  const modal = screen.queryByTestId("modal");
  expect(modal).not.toBeInTheDocument();
  fireEvent.click(button);
  await waitFor(() => expect(modal).toBeInTheDocument()); // Fails
});

我试着用await waitFor(() => expect(modal).toBeInTheDocument())和标准expect(modal).toBeInTheDocument())测试它。我也试着在没有portal的情况下渲染模态,但仍然对测试没有影响。你能解释一下应该如何测试吗?

tag5nh1u

tag5nh1u1#

这种行为很可能正在生成一个新的渲染,尝试使用act
一些有用的链接:https://github.com/threepointone/react-act-examples/blob/master/sync.md
https://testing-library.com/docs/preact-testing-library/api/#act

n6lpvg4x

n6lpvg4x2#

在火灾事件之后尝试这个,它会通过的。
wait waitFor(()=〉expect(modal));
如果视图中存在模态ID,则这将通过。

相关问题