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

React组件Tooltip悬停测试报错:TypeError: Cannot read properties of null

解决React测试中Tooltip悬停报错:Cannot read properties of null (reading 'createEvent')

问题代码

我编写了一个用于检查React组件中鼠标悬停时Tooltip值的测试用例,代码如下:

it("displays XYZ Information with 'Code' in a tooltip", async () => {
    (useRouter as jest.Mock).mockImplementation(() => ({ locale: "en-us" }));
    ....
    const { container } = renderPage(<Comp {...comprops} FLAG={true} />);
    await screen.findByRole("button", { name: /settings/i });
    const creatorCodeTooltip = container.querySelector(".tooltip-element");
    expect(creatorCodeTooltip).toBeInTheDocument();

    userEvent.hover(creatorCodeTooltip);

    waitFor(() => {
      expect(screen.queryByText(/TESTCREATORCODE1P8/i)).toBeInTheDocument();
    });
  });

报错信息

运行时出现如下错误:

node_modules/react-dom/cjs/react-dom.development.js:3905
      var evt = document.createEvent('Event');
                         ^

TypeError: Cannot read properties of null (reading 'createEvent')
    at Object.invokeGuardedCallbackDev (.../node_modules/react-dom/cjs/react-dom.development.js:3905:26)
    at invokeGuardedCallback (.../node_modules/react-dom/cjs/react-dom.development.js:4056:31)
    at flushPassiveEffectsImpl (.../node_modules/react-dom/cjs/react-dom.development.js:23543:11)
    at unstable_runWithPriority (.../node_modules/scheduler/cjs/scheduler.development.js:468:12)
    at runWithPriority$1 (.../node_modules/react-dom/cjs/react-dom.development.js:11276:10)
    at flushPassiveEffects (.../node_modules/react-dom/cjs/react-dom.development.js:23447:14)
    at Object.<anonymous>.flushWork (.../node_modules/react-dom/cjs/react-dom-test-utils.development.js:992:10)
    at Immediate.<anonymous> (.../node_modules/react-dom/cjs/react-dom-test-utils.development.js:1003:11)
    at processImmediate (node:internal/timers:466:21)

解决方法

  • 确保Tooltip元素稳定后再执行hover
    虽然代码中已经断言元素存在,但container.querySelector不会等待元素完全渲染完成。建议给Tooltip组件添加data-testid="tooltip-element",改用screen.findByTestId获取元素,它会自动等待元素挂载:

    // 替换原有的querySelector逻辑
    const creatorCodeTooltip = await screen.findByTestId("tooltip-element");
    await userEvent.hover(creatorCodeTooltip);
    
  • 给waitFor添加await并优化断言
    原代码中waitFor没有使用await,会导致测试流程提前结束,引发DOM异常。同时,queryByText返回null时不会抛出错误,改用getByText更适合断言元素存在:

    await waitFor(() => {
      expect(screen.getByText(/TESTCREATORCODE1P8/i)).toBeInTheDocument();
    });
    
  • 检查Jest的DOM环境配置
    这个报错大概率是测试环境中document对象为null导致的,确认Jest配置文件(jest.config.js)中启用了jsdom环境:

    module.exports = {
      testEnvironment: "jsdom",
      // 其他配置项...
    };
    
  • 优先使用screen查询而非container
    screen提供的查询方法(如findBy*、getBy*)是React Testing Library推荐的方式,会自动处理异步渲染,比直接操作container更可靠,能减少DOM元素未就绪的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:40:56