如何为 react-testing-library 定义容器大小?

Posted

技术标签:

【中文标题】如何为 react-testing-library 定义容器大小?【英文标题】:How to define container size for react-testing-library? 【发布时间】:2020-03-26 16:16:18 【问题描述】:

我已经研究过类似的问题(例如 this one),但在使用 react-testing-library 时,建议的解决方案对我不起作用。

我有一个可以接收多个孩子的组件。然后,该组件将计算自己的大小和子项的大小,以检查它能够渲染多少个子项。在我的应用程序中使用它时效果很好。

我的问题是,当使用react-testing-library 渲染这个组件时,该组件的容器被渲染为0 heightwidth;所以我的组件会明白没有可用空间来渲染任何孩子。

我试图在测试中定义一个custom container;试图强制一些样式设置widthheight;但这些都不起作用。

有没有办法“解决”这个问题?

组件(本题省略部分代码):

const ParentComponent = (props) => 
  const [visibleChildren, setVisibleChildren] = useState(0)
  const myself = useRef(null)

  useEffect(() => 
    const componentWidth = myself.current.offsetWidth;
    const childrenWidth = myself.current.children.reduce(
      // Returns the total children width
    )

    // Returns the number of children I can display
    const childrenAmount = calculateSpace()
    setVisibleChildren(childrenAmount)
  , [myself])

  // Slice the array of children to display only the right amount
  slicedChildren = props.children.slice(0, visibleChildren)

  return (
    <div ref=myself>
      slicedChildren
    </div>
  )

用途:

<ParentComponent>
  <Child />
  <Child />
  <Child />
</ParentComponent>

测试:

import React from 'react'
import render from '@testing-library/react'
import ParentComponent from '../ParentComponent'

test('Render component', () => 
  const  getAllByRole  = render(
    <ParentComponent>
      <Child />
      <Child />
      <Child />
    </ParentComponent>
  )

  expect(getAllByRole("Child").length).toEqual(3)
)

更新:

添加了这个codesandbox 示例。

【问题讨论】:

【参考方案1】:

我们可以在htmlElement.prototype 上模拟该财产权:

Object.defineProperties(window.HTMLElement.prototype, 
  offsetWidth: 
    get: function()  return this.tagName === 'SPAN' ? 100: 500
  
);

感谢https://github.com/jsdom/jsdom/issues/135#issuecomment-68191941

看看问题,它有很长的故事(自 2011 年以来!)但仍然开放

说实话,我看到嘲笑 offsetWidth 以使测试逻辑更可靠。我不希望从测试环境中一直计算真实样式(如偏移大小)。

【讨论】:

嗨,布鲁诺,拜托,我也面临着类似的问题。您究竟在测试代码中的哪个位置应用了上述 sn-p?谢谢。 祝福你,非常感谢分享!我一直在努力解决一个类似的场景,涉及一个永远不会检测到宽度变化的网格布局。将 offsetWidth 强制为特定值对我来说是个窍门,我同意这是一种合理的方法来检查某些东西的副作用,因为目标远不及测试浏览器调整宽度的能力,而是组件如果在浏览器中已经发生了调整大小,则行为相应。 嗨@Sau001,我在测试文件的beforeAll() 中添加了上面的片段。

以上是关于如何为 react-testing-library 定义容器大小?的主要内容,如果未能解决你的问题,请参考以下文章

react-testing-library - 屏幕与渲染查询

酶、ReactTestUtils 和 react-testing-library 之间的区别

使用 Cypress 和 React-testing-library 设置 CircleCI

如何使用 React-Testing-Library 测试 mapDispatchToProps?

在 react-testing-library 中,渲染应该只调用一次吗?

如何使用 Jest 和 react-testing-library 测试 useRef?