Sam*_*Sam 8 javascript unit-testing reactjs react-testing-library react-hooks
我有一个 useEffect 钩子,它在安装组件时加载,如下所示:
useEffect(() => {
listFiles().then(keys => {
setKeys(keys)
console.log(keys)
}).catch(err => {
showFail(err.message)
})
}, [])
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用反应测试库来测试该函数,只需使用渲染函数:
beforeEach(() => {
render(<Dashboard />)
})
Run Code Online (Sandbox Code Playgroud)
但是,当我运行任何解决承诺并设置状态的测试时:
jest.mock('../utils/storage', () => ({
listFiles: jest.fn(() => Promise.resolve([])),
}))
Run Code Online (Sandbox Code Playgroud)
我最终收到一条关于使用actto 包装事件的奇怪警告消息:
Warning: An update to Dashboard inside a test was not wrapped in act(...).
When testing, code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
This ensures that you're testing the behavior the user would see in the browser. Learn more at ..
in Dashboard
18 | useEffect(() => {
19 | listFiles().then(keys => {
> 20 | setKeys(keys)
| ^
21 | console.log(keys)
22 | }).catch(err => {
23 | showFail(err.message)
Run Code Online (Sandbox Code Playgroud)
我尝试将渲染包装在 中act,但它似乎没有改变任何东西。
关于我在这里做错了什么有什么建议吗?我应该以其他方式渲染吗?
提前致谢!
当您尝试在组件完成更新所有状态之前断言时,通常会发生此错误。
\n请注意,listFiles您在内部调用setKeys(keys)调用并更新状态。
你应该await让新密钥(或文件)显示在文档中:
expect(await findByText(\'some file name or key\')).toBeInTheDocument();\n// more asserts here\nRun Code Online (Sandbox Code Playgroud)\n或者,您可以等待模拟被调用(尽管我认为上面的选项更好)。
\nawait waitFor(() => expect(listFilesMock).toHaveBeenCalled());\n// more asserts here\nRun Code Online (Sandbox Code Playgroud)\n上面的方法应该已经act由 React 测试库为您包装好了,所以您不需要这样做
act()React文档内容如下:\n\n在编写 UI 测试时,渲染、用户事件或数据获取等任务可以被视为与用户界面交互的 \xe2\x80\x9cunits\xe2\x80\x9d 。React 提供了一个名为 act() 的帮助器,它确保在做出任何断言之前与这些 \xe2\x80\x9cunits\xe2\x80\x9d 相关的所有更新都已被处理并应用到 DOM。
\nact 名称来自 Arrange-Act-Assert 模式。
\n
| 归档时间: |
|
| 查看次数: |
7747 次 |
| 最近记录: |