如何编写依赖于 React 中 useState 钩子的条件渲染组件的测试?

Posted

技术标签:

【中文标题】如何编写依赖于 React 中 useState 钩子的条件渲染组件的测试?【英文标题】:How to write a test for conditional rendering component depended on useState hook in React? 【发布时间】:2019-12-28 14:20:50 【问题描述】:

我正在尝试为我的功能组件编写测试,但不明白如何将 isRoomsLoaded 模拟为 true,因此我可以正确测试我的 UI。我需要如何模拟以及模拟什么?

import React,  useState, useEffect  from 'react';
import  useSelector, useDispatch  from 'react-redux';
import  fetchRooms  from '../../store/roomsStore';  // Action creator


// Rooms component
export default ( match, location, history ) => 
    const roomsStore = useSelector(state => state.rooms);
    const dispatch = useDispatch();
    const [isRoomsLoaded, setRoomsLoaded] = useState(false);

    useEffect(() => 
        const asyncDispatch = async () => 
            await dispatch(fetchRooms());
            setRoomsLoaded(true);  // When data have been fetched -> render UI
        ;
        asyncDispatch();
    , [dispatch]);

    return isRoomsLoaded
        ? <RoomsList />  // Abstraction for UI that I want to test
        : <LoadingSpinner />;

;

【问题讨论】:

【参考方案1】:

如果您愿意,您可以完全模拟 useState 以仅返回 true 或 false,通过执行以下操作来获得您想要的任何结果。

const mockSetState = jest.fn();

jest.mock('react', () => (
  ...jest.requireActual('react'),
  useState: value => [true, mockSetState],
));

通过这样做,您可以有效地模拟 react,使用 react,除了 useState,它有点 hacky,但它会起作用。

【讨论】:

以上是关于如何编写依赖于 React 中 useState 钩子的条件渲染组件的测试?的主要内容,如果未能解决你的问题,请参考以下文章

为啥回调中的 React useState 依赖项为空?

useReducer 和 useState

hook——useState——useState的并发写法——受控组件—— 自定义hook函数-封装hook

如何修复 React Hook useEffect 缺少依赖项

在 React 中,如何使用 hook useState 来设置数据?

React-Native - 使用依赖于 node.js 核心模块的 Javascript 模块