当前位置: 首页 > 知识库问答 >
问题:

如何用React-Test-Library模拟内容溢出?

潘辰龙
2023-03-14

我正在使用材料表连同材料ui来创建一个电子表格应用程序。我实现的一个行为是单元格的最大宽度为50px。如果该单元格的内容太大,它将默认在单词的末尾使用省略号(参见启用了noWrap prop的排版材料-UI组件)。如果此单元格悬停,将呈现一个弹出窗口,显示单元格的全部内容。它通过检查scrollWidth>clientWidth来检查单元格是否溢出,如果是,则启用onMouseEnter和onMouseLeave行为来显示和隐藏弹出窗口。一切正常。我的问题是,我很难在使用jest/react-test-library编写的测试中复制这种行为。当我调用react-testing render方法时,它不会输出溢出行为,即使在cell组件中有一个很长的值。这是因为它是在虚拟呈现,而不是在浏览器中实际呈现吗?如果是的话,我有没有办法强迫溢出行为?我已经附加了我的当前组件,连同计算溢出函数和当前测试。

const calculateOverflow = element => {
  return element ? element.scrollWidth > element.clientWidth : false;
}
export default function OverflowCell(props) {
  const typeRef = useRef();
  const { value } = props;
  const classes = useStyles(props);
  const [anchorEl, setAnchorEl] = React.useState(null);

  const handlePopoverOpen = event => {
    setAnchorEl(event.currentTarget);
  };

  const handlePopoverClose = () => {
    setAnchorEl(null);
  };

  const isOverflowing = calculateOverflow(typeRef.current);

  const open = Boolean(anchorEl);

  return (
    <div>
      <Typography
        ref={typeRef}
        aria-owns={open ? 'mouse-over-popover' : undefined}
        aria-haspopup={isOverflowing ? 'true' : 'false'}
        aria-label={isOverflowing ? 'overflowCell' : 'cell'}
        onMouseEnter={isOverflowing ? handlePopoverOpen : undefined}
        onMouseLeave={isOverflowing ? handlePopoverClose : undefined}
        className={classes.overFlowText}
        noWrap
      >
        {value}
      </Typography>
      {isOverflowing && (
        <Popover
          className={classes.popover}
          classes={{
            paper: classes.paper,
          }}
          open={open}
          anchorEl={anchorEl}
          anchorOrigin={{
            vertical: 'bottom',
            horizontal: 'left',
          }}
          transformOrigin={{
            vertical: 'top',
            horizontal: 'left',
          }}
          onClose={handlePopoverClose}
          disableRestoreFocus
        >
          <Typography>{value}</Typography>
        </Popover>
      )}
    </div>
  );
}
it('triggers popover when overflowing string is hovered', async () => {
  const cellValue = 'test value that is very longggggggggggggggggggggggggggggggggggggggggg';
  const divStyle = {
    'max-width': '10',
  };
  mockRowData[0].forname = cellValue;
  const { asFragment, getByLabelText } = render(
    <div style={divStyle}>
      <OverflowCell value={cellValue} />
    </div>,
  );
  const initialRender = asFragment();
  const overflowCell = getByLabelText('cell');
  Simulate.mouseEnter(overflowCell);
  await delay(500);
  expect(initialRender).toMatchDiffSnapshot(asFragment());
  Simulate.mouseLeave(overflowCell);
  await delay(500);
  expect(initialRender).toMatchSnapshot(asFragment());
});

共有1个答案

连文栋
2023-03-14

我认为这是因为单元测试没有在真正的浏览器中运行。所以它不执行CSS,也没有滚动。

 类似资料:
  • 问题内容: 我对模拟还很陌生,并且我一直在尝试模拟实际内容(本质上仅在内存中创建一个虚拟文件),以便在任何时候都不会将任何数据写入磁盘。 我尝试过模拟文件和模拟尽可能多的属性的解决方案,然后还使用文件写入器/缓冲写入器将其写入,但是这些方法不能很好地工作,因为它们需要规范路径。有人找到了除此以外的解决方案,但我正在解决这个错误? 我一直在这样做: 任何想法或指导都将非常有帮助。在此之后的某个地方,

  • 问题内容: 说我有一个包含以下内容的模块: 我想为下半部分编写一个单元测试(我想实现100%的覆盖率)。我发现执行导入/设置机制的内置的 runpy 模块,但无法弄清楚如何模拟或检查 main() 函数是否被调用。 到目前为止,这是我尝试过的: 问题答案: 我将选择另一种替代方法,将其从覆盖率报告中排除,当然,只有在测试中已经具有main()函数的测试用例的情况下,您才能这样做。 至于为什么我选择

  • 我正在使用反应和电子构建桌面应用程序。由于它增长迅速,我意识到我需要某种状态管理,如Redux,以避免在组件之间传递许多属性。我开始阅读Redux官方留档,但仍然不知道如何在我的情况下实现它。我卡住了! 例如,我有一个呈现许多子组件的主组件。其中一个有按钮。点击后,它应该向商店发送一个“事件”,以便主可以执行相应的操作。我怎样才能做到这一点?我找不到事件的概念,我已经在如何开始使用Redux上碰壁

  • 问题内容: 我试图弄清楚如何对我的控制器的URL进行适当安全的单元测试。以防万一有人更改周围的内容并意外删除安全设置。 我的控制器方法如下所示: 我像这样设置一个WebTestEnvironment: 在我的实际测试中,我尝试执行以下操作: JUnit如何测试@PreAuthorize批注及其由spring MVC控制器指定的spring EL? 但是,如果仔细观察,这仅在不向URL发送实际请求时

  • 问题内容: App.js App.test.js 这个最小的示例在浏览器中可以正常工作,但是测试失败。我认为没有调用onChange处理程序。如何在测试中触发onChange回调?查找fireEvent元素的首选方法是什么?谢谢 问题答案: 这一定是关于RTL的最常见的问题:D 最好的策略是使用(或测试框架中的等效方法)模拟选择并呈现HTML选择。 有关为什么这是最佳方法的更多信息,我也写了一些适

  • 问题内容: 使用PHP如何模仿的自动链接行为(哪个BTW非常酷)? 在这种情况下,我不太在意属性。 转换成这样: 如何在PHP中创建类似的功能? PS:请查看我对此问题的评论,以获取更多示例和行为。 问题答案: 试试看 URL匹配的正则表达式模式来自DaringFireball。 输入文本: