reactjs - 如何测试异步useEffect?

标签 reactjs jestjs react-testing-library

如何测试异步 useEffectreact-testing-libs ?
我有:

// in other file
const getData = () => {
  return new Promsise(resolve => setTimeout(() => resolve([1, 2, 3]), 5000));
};

const MyComponent = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const data = await getData();
      setData(data);
    };
    fetchData();
  }, []);

  return <div>{data.map(item => <span>{item}</span>)}</div>
};
如何测试这个组件?
我现在的测试:
it('MyComponent test', async () => {
  await act( async () => {
    render(<MyComponent/>, container);
  });

  expect(container.innerHTML).toMatchSnapshot();
});
但是act,render不会等待useEffect()。
为什么 ?

最佳答案

react-testing-library 对此有一个干净的解决方案。您可以等待元素出现在 DOM 中,这意味着您的异步 useEffect顺其自然。
它叫waitFor它将在继续执行代码之前等待断言完成。您可以使用其他实用程序,例如 getByTextexpect

it('MyComponent test', async () => {
  await act( async () => {
    render(<MyComponent/>, container);
  });

  waitFor(() => {
    // I'd look for a real text here that is renderer when the data loads
    expect(container.queryElement('span')).toBeDefines();
  })

  expect(container.innerHTML).toMatchSnapshot();

});

关于reactjs - 如何测试异步useEffect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65635054/

相关文章:

javascript - 自定义 react 下拉菜单无法正确打开关闭

reactjs - 在 React with Enzyme 中测试去抖方法

javascript - Jest 自定义匹配器

react-testing-library - React 测试库 getByLabelText 不连接多部分 aria-labelledby

react-native - 使用 react-native-testing-library 在 Jest 中未呈现 NativeBase 内容

javascript - React,无需引用即可获取状态

node.js - npm install 或yarn 命令运行时间太长 (Ubuntu)

javascript - 使用 React 删除节点并用数组中的项目替换到同一节点位置

javascript - 用 Jest 模拟 ES6 类函数

reactjs - 如何使用 jest 和 RTL 模拟来自 react 组件的异步操作调用