react-testing-library - 如何使用 react-testing-library 测试反应列表项的移动
问题描述
尝试测试一个呈现字符串列表的简单组件,单击时每个项目都会移到顶部。
const Component = p => {
const [data, setData] = React.useState(p.data)
const moveToTop = from => {
const nextData = [...data]
const target = nextData.splice(from, 1)[0]
nextData.unshift(target)
setData(nextData)
}
console.log(data, 'data')
return (
<ul>
{data.map((d, i) => (
<li
aria-label="li"
key={d}
onClick={() => {
moveToTop(i)
}}
>
{d}
</li>
))}
</ul>
)
}
// ... test ...
test('move element', async () => {
render(<Component data={['a', 'b', 'c']} />)
const liArr = screen.getAllByLabelText('li')
expect(liArr.length).toBe(3)
expect(liArr[0].textContent).toBe('a')
fireEvent.click(liArr[2])
expect(liArr[0].textContent).toBe('c')
})
在codesandbox中,log显示clickEvent设置数据成功,但最后一次assert失败。我知道反应重新渲染需要时间,但我也注意到它的渲染 api@testing-library/react
已经包装好了。act
在搜索 github 问题和 stackoverflow 之后,我仍然卡在这个测试用例中。
需要您的帮助,任何文档和示例都有意义,谢谢!
解决方案
顺序发生了li
变化,但您没有断言新结构。在点击事件之后再做一次screen.getAllByLabelText('li')
并断言。
推荐阅读
- apache-flink - Flink 检查点不断失败
- javascript - 自定义反应数据表组件中的水平和垂直滚动问题
- vim - 如何删除 Vim 中某个字符之前的所有内容?
- typescript - 在 Angular 中评估枚举
- asp.net-core - .Net Core Swagger 不适用于必需的枚举?
- android - 在 Mac 上使用 Android Studio 在命令行中构建 Android 应用
- android - 尝试在空对象引用上调用虚拟方法 在空对象引用上调用虚拟方法
- ruby-on-rails - Rails 6 ActiveStorage 中的直接上传问题
- windows - 用批处理替换文件名中的字符
- javascript - 通过 Javascript 用 curInnerHTML 替换 HTML 中的电话号码