我正在尝试测试一个应该打开其模态的组件。模态是这个组件的一部分,但它是用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的情况下渲染模态,但仍然对测试没有影响。你能解释一下应该如何测试吗?
2条答案
按热度按时间tag5nh1u1#
这种行为很可能正在生成一个新的渲染,尝试使用act
一些有用的链接:https://github.com/threepointone/react-act-examples/blob/master/sync.md
https://testing-library.com/docs/preact-testing-library/api/#act
n6lpvg4x2#
在火灾事件之后尝试这个,它会通过的。
wait waitFor(()=〉expect(modal));
如果视图中存在模态ID,则这将通过。