javascript - 为什么 useState 不在单元测试(Jest、Enzyme)中重新渲染组件?

标签 javascript reactjs typescript jestjs enzyme

我在 Jest 中重新渲染 Enzyme-wrapped 组件时遇到问题。我花了一些时间来缩小问题的范围,但它似乎是 useState 和 Enzyme 的问题。

我有一个带有按钮的组件。单击该按钮会调用 setState() 函数来更新组件状态并重新呈现。例如:

// ...
<Drawer
  classes={{ paper: classes.drawer }}
  anchor="right"
  open={showInfoDrawer}
  variant={mobile() ? 'temporary' : 'persistent'}
  onClose={() => {
    console.log('closing'); // to check onClose simulation works
    setShowInfoDrawer(false);
  }}
  >
  // rest of component...
</Drawer>
// ...

在此示例中,setShowInfoDrawer()useState() Hook 的一部分,作为 prop 从父组件传递下来。

当我运行测试时(参见下面的示例),点击模拟似乎有效,但组件没有重新呈现。

test('should close ActivityInfoDrawer', () => {
  expect(wrappedActivityInfoDrawer.find(Drawer)).toHaveLength(1);
  const wrappedDrawer = wrappedActivityInfoDrawer.find(Drawer);
  // @ts-ignore
  act(() => wrappedDrawer.props().onClose()); // Logs "Clicked..."
  wrappedActivityInfoDrawer.update();
  expect(wrappedActivityInfoDrawer.find(Drawer)).toHaveLength(0); // Fails
  });

我做了一些研究,似乎有一段时间 Enzyme 不支持 useState,但地址在这个 PR 中,看起来它是与版本 3.11.0 一起发布的,甚至可能是 3.10.0(我使用的是最新的 3.11.0)。

我做错了什么?是因为 setShowInfoDrawer() 来自父组件吗?如果是这样,我该如何让它发挥作用?

最佳答案

好吧,我明白了。事后看来,这是很明显的。我需要将此测试作为对父组件(即打开抽屉并具有 useState() Hook 的组件)的测试,而不是作为一个单元运行测试抽屉组件本身。

关于javascript - 为什么 useState 不在单元测试(Jest、Enzyme)中重新渲染组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62566028/

相关文章:

django - 为什么使用 nginx 服务的网站没有应用样式

javascript - 如何仅使用 onload 函数而不是 javascript 删除 iframe 中的类

javascript - JQuery .text() 函数在使用面包屑代码时返回上一页元素的文本值

javascript - React Slick 没有预期的默认水平行为

reactjs - 函数中的调度参数有什么意义?

typescript - 是否可以在 VSCode(或其他地方)中显示 typescript 类型/接口(interface)的完整计算类型

javascript - Angularjs:Html 呈现为文本

javascript - 使用 reactjs 添加动态标签

javascript - 如何使用 webpack-chain 将 appendTsSuffixTo 选项添加到 ts-loader?

typescript - 如何在 Svelte 中实现 Google Analytics GTAG GDPR 合规性