无法在 useEffect 挂钩中测试超时功能

Posted

技术标签:

【中文标题】无法在 useEffect 挂钩中测试超时功能【英文标题】:unable to test timeout function within useEffect hook 【发布时间】:2021-04-07 20:12:28 【问题描述】:

我正在创建一个延迟加载图像加载器组件,如果图像可见超过 500 毫秒,它将加载图像。

它按预期工作,但我无法编写测试来验证它

我试过 jest.runallTimers,setTimeout 但没有成功。我在 Google 上搜索了如何在 useEffect 挂钩中使用 settimeout 测试代码,但没有一个对我有用。

我正在分享一个代码框链接,以防有人有兴趣提供帮助。

https://codesandbox.io/s/optimistic-aryabhata-1dtru?file=/__tests__/index.test.js

【问题讨论】:

【参考方案1】:

要测试一段时间后呈现的图像,您可以这样做:

it("shows Loading and then renders the image", async (done) => 
  render(<LazyloadImage />);

  expect(await screen.findByTestId("fallbackText")).toBeInTheDocument();

  expect(
    await screen.findByTestId("image", ,  timeout: 500 )
  ).toBeInTheDocument();

  done();
);

你的自定义钩子有问题(导致测试失败),所以我从组件中删除了它,但让其他所有东西在 500 毫秒后渲染图像。

这是一个有效的sandbox

【讨论】:

似乎在钩子中使用窗口对象是用一些具体值替换它后的问题,测试通过没有任何问题。【参考方案2】:

试试开玩笑的done():

it('your async test case', (done) => 

    setTimeout(() => 
        // your expect statement
        done();
    , 1000);

);

【讨论】:

以上是关于无法在 useEffect 挂钩中测试超时功能的主要内容,如果未能解决你的问题,请参考以下文章

在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试

如何使用 jest/enzyme 测试 useEffect 与 useDispatch 挂钩?

无法使用 MaterialTable 中的 useEffect 挂钩显示数据

无法对未安装的组件执行 React 状态更新(useEffect 反应挂钩)

移动设备上的 React useEffect 挂钩未清除 setTimeout

如何将 setState 值插入 useEffect 挂钩?