reactjs - 有没有办法用react-test-renderer测试Chakra-ui模式对话框?

标签 reactjs unit-testing jestjs chakra-ui react-test-renderer

我拼命尝试测试一个模态,但无法理解它!

这就是我现在的位置:

expect(
  create(
    <PortalManager>
      <Modal isOpen={true} onClose={jest.fn()}>
        <ModalOverlay />
        <ModalContent>
          <ModalHeader>Modal Title</ModalHeader>
          <ModalCloseButton />
          <ModalBody>Modal body</ModalBody>
          <ModalFooter>Modal footer</ModalFooter>
        </ModalContent>
      </Modal>
    </PortalManager>,
  ).toJSON(),
).toMatchSnapshot();

我强制打开模式。我在它周围添加了 PortalManager 以确保 Chakra 知道在哪里放置模式,但快照始终为空。

最佳答案

好吧,一个选择可能是模拟 PortalManager 本身,并使其表现得像 React.Component 而不是 React.ReactPortal,所以类似

const divWithChildrenMock = (children, identifier) => <div data-testId={identifier}>{children}</div>;
const divWithoutChildrenMock = (identifier) => <div data-testId={identifier} />;

jest.mock("@chakra-ui/react", () => (
  {
    ...jest.requireActual("@chakra-ui/react"),
    PortalManager: jest.fn(({ children }) => divWithChildrenMock(children, "portal")),
    Modal: jest.fn(({ children }) => divWithChildrenMock(children, "modal")),
    ModalOverlay: jest.fn(({ children }) => divWithChildrenMock(children, "overlay")),
    ModalContent: jest.fn(({ children }) => divWithChildrenMock(children, "content")),
    ModalHeader: jest.fn(({ children }) => divWithChildrenMock(children, "header")),
    ModalFooter: jest.fn(({ children }) => divWithChildrenMock(children, "footer")),
    ModalBody: jest.fn(({ children }) => divWithChildrenMock(children, "body")),
    ModalCloseButton: jest.fn(() => divWithoutChildrenMock("close")),
  }
));

通过查看以下源文件

https://github.com/chakra-ui/chakra-ui/blob/main/packages/modal/src/modal.tsx

您可以看到,即使模态组件也使用 Portal,因此,您也应该模拟这些组件,如示例中所示。

测试 ID 在测试中非常有用,可以在快照中检查所有组件是否以正确的顺序呈现。

关于reactjs - 有没有办法用react-test-renderer测试Chakra-ui模式对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69585390/

相关文章:

c++ - 什么是全局状态?它们如何影响可测试性以及如何避免它们?

java - JMockit:显示有关缺少调用 1 错误的模糊错误消息

unit-testing - 如何用 Jest 测试一个React组件是否包含另一个组件?

javascript - Jest 一次性模拟多个组件

unit-testing - 在 DateTime 中使用 Moles

javascript - React 和 Jest,如何测试更改状态和检查另一个组件

javascript - 功能组件的 redux hooks

javascript - 将鼠标悬停在边框上拉动/拉伸(stretch) div?

javascript - 使用 Jest 和 enzyme react 输入 onchange 模拟不更新值

javascript - 如何链接 RCTCameraRoll for Android