"Click" 事件未触发 Jest

"Click" Event Not Firing for Jest

我正在用 jest 编写一些测试,但无法触发 click 事件。

这是第一个有效的测试:

  it("should open drawer", () => {
    const { getByTestId } = render(<Header />);
    fireEvent.click(getByTestId("menuButton"));
    expect(getByTestId("drawer")).toBeVisible();
  });

测试成功点击打开我的“抽屉”元素。该函数通过删除默认情况下通常位于此“抽屉”元素上的 visibility: hidden 样式来工作。

但是,我在测试“关闭”按钮时遇到了一些问题,该按钮会重新添加该样式。

  it("should close drawer", () => {
    const { getByTestId } = render(<Header />);
    fireEvent.click(getByTestId("menuButton"));
    fireEvent.click(getByTestId("close"));
    expect(getByTestId("drawer")).not.toBeVisible(); // This doesn't work...
  });

DOM(screen.debug)似乎没有接收到第二次点击。记录 DOM 显示未应用样式。尽管功能正常,但仍会发生这种情况,例如使用 Google Dev-Tools,使用这些功能:

// These both work....
$("button[data-testid='menuButton']").click()
$("button[data-testid='close']").click()

怎么了?为什么第二次点击事件没有触发?

这是我的完整组件:

import React, { useState } from "react";
import { Drawer, IconButton } from "@material-ui/core";
import Close from "@material-ui/icons/Close";
import Menu from "@material-ui/icons/Menu";
import history from "../../history";

import Links from "./links";

import "./style.scss";

const Header = React.memo(function Header(props) {
  const [mobileOpen, setMobileOpen] = useState(false);

  const handleGoHome = () => {
    history.push("/");
  };

  function handleDrawerToggle() {
    setMobileOpen(!mobileOpen);
  }

  return (
    <header className="header shadow">
      <nav>
        <IconButton
          data-testid="menuButton"
          onClick={handleDrawerToggle}
          className="menuButton pointer"
        >
          <Menu />
        </IconButton>
        <h1 onClick={handleGoHome} className="mainTitle pointer">
          Cloture
        </h1>
        <Drawer
          className="drawer"
          data-testid="drawer"
          anchor={"left"}
          open={mobileOpen}
          onClose={handleDrawerToggle}
        >
          <IconButton
            data-testid="close"
            className="close"
            onClick={handleDrawerToggle}
          >
            <Close />
          </IconButton>
          <Links
            setMobileOpen={setMobileOpen}
            links={[
              { label: "Calendar", link: "/calendar" },
              { label: "Senate", link: "/committees/senate" },
              { label: "House", link: "/committees/house" },
            ]}
          />
        </Drawer>
      </nav>
    </header>
  );
});

export default Header;

根据 docs#waiting-for-disappearance,我认为您需要使用 waitForElementToBeRemoved() 异步助手,因为会发生动画。

it("should close drawer", async () => {
  const { getByTestId, queryByTestId } = render(<Header />);

  fireEvent.click(getByTestId("menuButton"));
  expect(getByTestId("drawer")).toBeVisible();

  fireEvent.click(getByTestId("closeButton"));
  await waitForElementToBeRemoved(getByTestId("drawer"));

  expect(queryByTestId("drawer")).toBeNull();

});

不需要queryByTestId,只是为了绝对表明它已经消失了。

我在这里有一个使用你的代码的工作示例: