【问题标题】:React testing library element title undefinedReact 测试库元素标题未定义
【发布时间】:2021-11-01 03:43:46
【问题描述】:

我正在尝试测试当我将鼠标悬停在图标上时,会出现带有特定文本的工具提示。

使用 Jest,react 测试库,工具提示是一个 MUI 4 组件。

图标和工具提示

<div
   data-testid="tooltip-icon"
   className={classes.infoTooltipIcon}
>
   <Tooltip
      data-testid="tooltip-text"
      title="Tooltip text"
   >
      <InfoIcon/>
   </Tooltip>
</div>

瘦身测试

it('has a tooltip on the info icon', () => {
    render(<Component />);

    const infoIcon = screen.getByTestId('tooltip-icon');
    userEvent.hover(infoIcon); // works
    
    const infoTooltip = screen.getByTestId('tooltip-text')
    expect(infoTooltip.title).toEqual('Tooltip text);
  });

目前,这会导致

actual: undefined
expected: 'Tooltip text'

如果我 screen.debug(infoTooltip) title 在那里并且有正确的文本,但它是 &lt;svg/&gt; 这会导致问题吗?

screen.debug(infoTooltip)的输出

<svg
      aria-hidden="true"
      class="MuiSvgIcon-root makeStyles-center-52"
      data-testid="tooltip-text"
      focusable="false"
      title="Tooltip text"
      viewBox="0 0 24 24"
    >
      <path
        d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"
      />
    </svg>

另外,我也试过screen.getByTitle('Tooltip text'),还是不行。

【问题讨论】:

  • 你可以尝试使用queryByTestId而不是getByTestId吗?
  • 同样的事情,actual: undefined,我已经发布了screen.debug()的输出

标签: reactjs jestjs material-ui react-testing-library


【解决方案1】:

您对跨度的建议很好!如果您不想添加跨度,那么我认为您只需要调整查询以查找 aria-hidden 元素。(由于 svg 具有 aria-hidden=true 它会从可访问性树中排除)。查询如下所示: const tooltip = screen.getByTitle("Tooltip text", { hidden: true } )

【讨论】:

    【解决方案2】:

    似乎 MUI 将工具提示应用于&lt;Tooltip/&gt; 的任何子对象,在我的情况下,它是由&lt;InfoIcon/&gt; 生成的&lt;svg/&gt;。如果将&lt;InfoIcon/&gt; 包装在&lt;span&gt; 标记中,则工具提示title 将应用于&lt;span/&gt;,从而可以显式查找工具提示文本。

    我的用户界面

    <div
       data-testid="tooltip-icon"
       className={classes.infoTooltipIcon}
    >
       <Tooltip
          data-testid="tooltip-text"
          title="Tooltip text"
       >
          <span>
             <InfoIcon/>
         </span>
       </Tooltip>
    </div>
    

    我的测试

    it('has a tooltip on the info icon', () => {
        render(<Component />);
    
        const infoIcon = screen.getByTestId('tooltip-icon');
        userEvent.hover(infoIcon);
        
        const infoTooltip = screen.getByTestId('tooltip-text')
        expect(infoTooltip.title).toEqual('Tooltip text);
      });
    

    这样,如果我有多个工具提示,我可以确保通过测试 id 获取我想要的确切一个。

    【讨论】:

      【解决方案3】:

      更好的解决方案是你应该只使用 InfoIcontitleAccess 道具。 https://material-ui.com/api/svg-icon

      <InfoIcon titleAccess="Tooltip Text" />
      

      之后,您可以像这样对组件进行测试。

      expect(
            getByRole('tooltip', { hidden: true, name: 'Tooltip Text' }),
          ).toBeInTheDocument();
      

      【讨论】:

      • 如果您将 roletooltip 更改为 img 这可行,我认为 MUI 会将工具提示应用于子元素的任何内容,在这种情况下是 &lt;svg/&gt; 选择对于不同的更明确的解决方案,因为我有一些带有多个工具提示的组件,这将不起作用/不太干净。
      猜你喜欢
      • 2021-04-24
      • 2019-08-23
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2019-06-11
      • 2022-06-30
      相关资源
      最近更新 更多