reactjs - React Hooks - useReducer() - 集成测试

标签 reactjs jestjs react-hooks enzyme

我编写了一个功能组件,它使用 React.useReducer() 钩子(Hook)作为代码的一部分。

该组件有一个 reducer 和 Action 作为其中的一部分。我认为与其单独测试 reducer 功能和操作,不如编写一个集成测试:

IntegrationTest.js

describe('integration test for reducers and actions', () => {
    const initialState = { secretWord: 'party' };

    test('dispatch actions and verify updated state', () => {
        const [state, dispatch] = React.useReducer(reducer, initialState);
        dispatch({ type: setSecretWord, payload: 'train' });
        expect(state).toEqual({ secretWord: 'train' });
    });
});

当我运行测试时,我收到错误:

无效的 Hook 调用。钩子(Hook)只能在函数组件的主体内部调用。发生这种情况可能是由于以下原因之一: 1.您的React和渲染器版本可能不匹配(例如React DOM) 2. 你可能违反了 Hooks 规则 3.您可能在同一个应用程序中拥有多个React副本

在这种情况下如何编写集成测试,因为钩子(Hook)只能在组件内调用?

最佳答案

尝试更新代码如下 - 使用 renderHook

import { renderHook } from '@testing-library/react-hooks';

describe('integration test for reducers and actions', () => {
    const initialState = { secretWord: 'party' };

    test('dispatch actions and verify updated state', () => {
        const [state, dispatch] = renderHook(() => useReducer(reducer, initialState));
        dispatch({ type: setSecretWord, payload: 'train' });
        expect(state).toEqual({ secretWord: 'train' });
    });
});

关于reactjs - React Hooks - useReducer() - 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60991857/

相关文章:

javascript - 与 apollo-server 的 Websocket 连接返回乱码的 connectionParams

reactjs - react useState,useEffect中的setState不更新数组

javascript - 你能用 Jest 只模拟外部模块的一部分吗?

react-native - 在 React Native 中使用 Jest 测试在对象上调用的函数

javascript - Vue + Jest 无法读取未定义的属性 'default'

javascript - 从组件中的 useState 多次调用状态更新程序会导致多次重新渲染

javascript - React Hook 不更新

javascript - React From Service 中的条件语句

javascript - 滚动 div 代码

javascript - React-native 使用 react-native-sound 从 s3 URL 播放音频