我在这里遇到了一个测试,我想验证在滚动通过一个列表组件后,由react-window导入,不同的项目正在呈现。列表位于一个表组件中,该组件在React上下文中保存滚动位置,这就是为什么我需要测试整个表组件。
不幸的是,滚动事件似乎没有任何效果,列表仍然显示相同的项目。
测试看起来像这样:
render(
<SomeProvider>
<Table />
</SomeProvider>
)
describe('Table', () => {
it('scrolls and renders different items', () => {
const table = screen.getByTestId('table')
expect(table.textContent?.includes('item_A')).toBeTruthy() // --> true
expect(table.textContent?.includes('item_Z')).toBeFalsy() // --> true
// getting the list which is a child component of table
const list = table.children[0]
fireEvent.scroll(list, {target: {scrollY: 100}})
expect(table.textContent?.includes('item_A')).toBeFalsy() // --> false
expect(table.textContent?.includes('item_Z')).toBeTruthy() // --> false
})
})
任何帮助都将不胜感激。
2条答案
按热度按时间vybvopom1#
我有一个场景,其中某些演示方面取决于滚动位置。为了使测试更清晰,我在测试设置中定义了以下模拟:
1.保证程序化滚动触发相应事件的模拟:
以上确保了在进行编程滚动后,将发布相应的
ScrollEvent
,并相应地更新window
属性。2.为同级集合设置基本布局的Mock
有了这两个,我会像这样写我的测试:
这里的想法是,在给定级别上为所有兄弟节点提供合理的、统一的宽度和高度,就好像它们被呈现为列/行一样,从而强加一个简单的布局结构,
table
组件在计算显示/隐藏哪些子节点时将“看到”。请注意,在您的场景中,兄弟元素的公共父元素可能不是
table
呈现的根HTML元素,而是嵌套在其中的某个元素。检查生成的HTML以了解如何最好地获取句柄。您的用例有点不同,因为您自己触发事件,而不是将其绑定到特定的操作(例如,按钮单击)。因此,您可能不需要完整的第一部分。
lzfw57am2#
默认情况下,
react-testing-library
在jsdom环境中呈现组件,而不是在浏览器中。基本上,它只生成html标记,但不知道组件的位置,它们的滚动偏移量等。例如,参见此问题。
可能的解决方案包括: