【问题标题】:"Click" Event Not Firing for Jest“点击”事件不为开玩笑而触发
【发布时间】:2020-08-18 22:41:46
【问题描述】:

我正在使用 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;

【问题讨论】:

  • @material-ui/core 是否使用 Javascript 为组件设置动画?您是否尝试过将您的 fireEvent.click 调用封装在 act(() =&gt; {} ) 中?

标签: javascript reactjs testing jestjs react-testing-library


【解决方案1】:

根据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 不是必需的,只是为了表明它已经消失了。

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

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2014-11-02
    • 2018-04-18
    相关资源
    最近更新 更多