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

React Testing Library无法渲染react-tooltip v5问题求助

React Tooltip v5.28 无法通过userEvent触发显示的排查与解决

问题分析

react-tooltip旧版本无需用户交互就能渲染提示框,但升级到v5.28后,即便用userEvent模拟点击、hover等操作,tooltip仍无法正常显示。结合提供的测试代码,核心问题集中在异步渲染等待、参数结构变化、配置冲突这几个方向。

解决步骤

  • 等待延迟渲染时间
    代码里设置了delayShow={100},意味着点击后tooltip会延迟100ms才渲染。测试中直接调用screen.debug()会在tooltip还没渲染完成时执行,自然看不到元素。需要用waitFor包裹断言,确保等待tooltip渲染完成:

    await user.click(anchorElement);
    // 等待tooltip出现并验证元素存在
    await waitFor(() => {
      expect(screen.getByTestId('tooltip-content')).toBeInTheDocument();
    });
    screen.debug();
    
  • 适配自定义render的参数结构
    v5.x版本中react-tooltip的render函数参数结构可能有变化,原代码里dataTip.content可能无法正确获取内容。可以临时打印参数确认结构,或者直接兼容新旧结构写法:

    render={(dataTip) => {
      // 可临时打印查看参数结构
      // console.log('render props:', dataTip);
      return (
        <div className="tooltip-content" data-testid="tooltip-content">
          <div className="tooltip-text" data-testid="tooltip-text">
            {dataTip.props?.content || dataTip.content}
          </div>
        </div>
      );
    }}
    
  • 检查配置项冲突
    同时设置openOnClick和clickable可能导致事件传递异常,可先移除clickable测试是否能正常显示;另外globalCloseEvents中的clickOutsideAnchor可能在点击后立刻关闭tooltip,建议临时注释该配置排查问题。

  • hover触发的额外注意
    如果用user.hover()触发tooltip,要确保tooltip的trigger属性为hover(默认值,但如果被openOnClick覆盖,需显式设置trigger="hover"),同时hover操作同样需要等待delayShow设置的延迟时间。

修改后的完整测试代码示例

it('should render tooltip', async () => {
  const user = userEvent.setup();

  const SampleComponent = () => (
    <>
      <div
        data-tooltip-id="sample-tooltip"
        data-tooltip-content="Test Tooltip popup"
        role="button"
        data-testid="sample-field-help"
      >
        Tooltip Content
      </div>
      <ReactTooltip
        id="sample-tooltip"
        role="tooltip"
        delayShow={100}
        clickable
        globalCloseEvents={{ clickOutsideAnchor: true, scroll: true }}
        openOnClick
        render={(dataTip) => (
          <div className="tooltip-content" data-testid="tooltip-content">
            <div className="tooltip-text" data-testid="tooltip-text">
              {dataTip.props?.content || dataTip.content}
            </div>
          </div>
        )}
      />
    </>
  );

  render(<SampleComponent />);
  const anchorElement = screen.getByTestId('sample-field-help');
  
  await user.click(anchorElement);
  
  // 等待tooltip渲染完成并验证
  await waitFor(() => {
    expect(screen.getByTestId('tooltip-content')).toBeInTheDocument();
  });

  screen.debug();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:37:05