You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Testing Library中user-event 14.4.3点击事件测试失败求助

React计数器点击功能测试失败问题

我正在测试一个简单的React计数器组件:点击按钮后计数器从0递增到1,但测试代码执行报错。以下是相关代码和配置:

计数器组件代码

import { useState } from "react";

export const Counter = () => {
     const [counter, setCounter] = useState(0);
     return (
        <>
          <h1>{counter}</h1>
          <button onClick={() => setCounter(count => count + 1)} >INCREMENT +</button>
        </>
     );
};

测试代码(原错误版本)

import {render, screen} from "@testing-library/react"
import { Counter } from "./Counter";
import { user } from "@testing-library/user-event";
import "./Counter";

test("renders count of 1 when clicking on INCREMENT + button", async () => {
     user.setup()
     render(<Counter />)
     const incrBtn = screen.getByRole("button", {
          name: "INCREMENT +"
     });
     await user.click(incrBtn);
     const countElmnt = screen.getByRole("heading");
     expect(countElmnt).toHaveTextContent("1");
});

当前依赖配置

"dependencies": {
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },

  "devDependencies": {
    "@testing-library/dom": "^9.3.1",
    "@testing-library/user-event": "^14.4.3"
  }

已尝试操作

执行命令安装最新测试库:

npm install --save-dev @testing-library/user-event @testing-library/dom

问题原因及修复方案

测试代码的核心错误在于没有正确初始化user-event实例:

@testing-library/user-event v14+版本中,setup()方法会返回一个初始化后的用户操作实例,必须使用这个实例来调用click等操作方法,而非直接使用导入的user对象。另外,测试代码中多余的import "./Counter";可以删除。

修正后的测试代码如下:

import {render, screen} from "@testing-library/react"
import { Counter } from "./Counter";
import userEvent from "@testing-library/user-event";

test("renders count of 1 when clicking on INCREMENT + button", async () => {
  // 接收setup返回的用户操作实例
  const user = userEvent.setup();
  render(<Counter />);
  
  const incrBtn = screen.getByRole("button", {
    name: "INCREMENT +"
  });
  await user.click(incrBtn);
  
  const countElmnt = screen.getByRole("heading");
  expect(countElmnt).toHaveTextContent("1");
});

内容的提问来源于stack exchange,提问作者VAIBHAV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:43:16