我有一个生成警告An update to DropDownMultiPick inside a test was not wrapped in act(...)的测试

警告指向以下代码:

  10 |   const toggleDropdown = () => {
> 11 |     setIsOpen(!isOpen);
     |     ^
  12 |   };

我的组件

const DropDownMultiPick = ({ title, options, selectedOptions, handleOptionsChange }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [tempSelectedOptions, setTempSelectedOptions] = useState([...selectedOptions]);

  const toggleDropdown = () => {
    setIsOpen(!isOpen);
  };
  ...

我的测试

const title = "Test Options";
const options = ["Option 1", "Option 2", "Option 3"];
const selectedOptions = ["Option 1"];
const handleOptionsChange = jest.fn();
  it("should open and close the dropdown menu on toggle button click", async () => {
    render(
      <DropDownMultiPick
        title={title}
        options={options}
        selectedOptions={selectedOptions}
        handleOptionsChange={handleOptionsChange}
      />
    );

    const user = userEvent.setup();

    const toggleButton = screen.getByRole("button", { name: "Option 1" });

    await user.click(toggleButton);
    // expect(await screen.findByRole("button", { name: /done/i })).toBeInTheDocument();

    await waitFor(() => {
      expect(screen.getByRole("button", { name: /done/i })).toBeInTheDocument();
    });
  });

我所try 的

我在我的组件里加了一个act.警告消失了,但我不认为在这个地方加act是最好的解决方案!

const DropDownMultiPick = ({ title, options, selectedOptions, handleOptionsChange }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [tempSelectedOptions, setTempSelectedOptions] = useState([...selectedOptions]);

  const toggleDropdown = async () => {
    await act(async () => {
      setIsOpen(!isOpen);
    });
  };

问题

消除此警告的最佳解决方案是什么?我看了这个网站,但没有用:https://kentcdodds.com/blog/fix-the-not-wrapped-in-act-warning

EDIT

整个组件:

// src/components/batchrec/dropdown-menu-multipick.jsx
import React, { useState } from "react";
import "./dropdown-menu-multipick.styles.scss";

const DropDownMultiPick = ({ title, options, selectedOptions, handleOptionsChange }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [tempSelectedOptions, setTempSelectedOptions] = useState([...selectedOptions]);

  const toggleDropdown = () => {
    setIsOpen(!isOpen);
  };

  const handleItemClick = (option) => {
    if (tempSelectedOptions.includes(option)) {
      setTempSelectedOptions(tempSelectedOptions.filter((item) => item !== option));
    } else {
      setTempSelectedOptions([...tempSelectedOptions, option]);
    }
  };

  const handleClose = () => {
    setIsOpen(false);
  };

  const handleDone = () => {
    handleOptionsChange(tempSelectedOptions);
    handleClose();
  };

  return (
    <div className="dropdown-multipick__container">
      <span className="label-title-style-5">
        <span className="dropdown-multipick__text label-title-style-1">{title}: </span>
        <button className="dropdown-multipick__toggle" onClick={toggleDropdown}>
          {selectedOptions.join(", ") || "Select..."}
        </button>
      </span>
      {isOpen && (
        <div className="dropdown-multipick__menu">
          {options.map((option, index) => (
            <div
              key={index}
              className={`dropdown-multipick__item ${
                tempSelectedOptions.includes(option) ? "dropdown-multipick__item--selected" : ""
              }`}
              onClick={() => handleItemClick(option)}
            >
              {option}
            </div>
          ))}
          <button className="dropdown-multipick__done" onClick={handleDone}>
            Done
          </button>
        </div>
      )}
    </div>
  );
};

export default DropDownMultiPick;

推荐答案

当与React 18一起使用时,这似乎是react-testing-library本身的一个错误.错误修复已经在this issue中合并,并在@testing-library/react版本14.0.0中发布.

您可以将您的@testing-library/react更新到latest version,这应该可以解决问题.

Reactjs相关问答推荐

使用useEffect挂钩获取数据

如何等待我的插入内容提交后再继续执行指令?

LocalStore未存储正确的数据

捕获表单数据时的Reactjs问题

在transformResponse中使用来自其他查询的缓存

shadcn输入+窗体+Zod;一个部件正在改变要被控制的不受控制的输入;

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

React Wordpress Apache 在索引之外重新加载 -> 未找到页面

画布:用鼠标绘制形状时重新绘制整个画布会导致卡顿

在一个事件处理程序中进行多次调度是个好主意吗?

React Router 6 点击链接在 React 18 应用中打开 flickr 页面

每次状态更改时都会提交react 表单

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

如何通过 React JS 中的映射将新元素添加到对象数据数组中

如何在对话素材ui中设置边框半径?

如何在自定义 JSX 元素上声明属性?

模块解析失败:意外令牌 (257:106) 您可能需要适当的加载程序来处理此文件类型

Cypress - 在继续之前等待下一个按钮重新出现

如何在 React JS 上使文本中的单词可点击